如何模拟“按任意键继续?”

我想写一个C ++程序,当用户从键盘input任何字符,它应该移动到下一行代码。

这是我的代码:

char c; cin>>c; cout<<"Something"<<endl; 

但是这是行不通的,因为只有当我input一些字符,然后按下ENTER时才移动到下一行。

要么

如果我使用这个

 cin.get() or cin.get(c) 

当我按Enter键时,它移动到下一行指令。

但是我想让它移动到键盘上按下的任何按键的下一行,如何做到这一点?

如果您在Windows上,则可以使用Microsoft运行时库的一部分kbhit() 。 如果你在Linux上,你可以这样实现kbhit ( 源代码 ):

 #include <stdio.h> #include <termios.h> #include <unistd.h> #include <fcntl.h> int kbhit(void) { struct termios oldt, newt; int ch; int oldf; tcgetattr(STDIN_FILENO, &oldt); newt = oldt; newt.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &newt); oldf = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK); ch = getchar(); tcsetattr(STDIN_FILENO, TCSANOW, &oldt); fcntl(STDIN_FILENO, F_SETFL, oldf); if(ch != EOF) { ungetc(ch, stdin); return 1; } return 0; } 

更新:上面的函数在OS X上工作(至less,在OS X 10.5.8 – Leopard,所以我希望它可以在更新的OS X版本上工作)。 这个要点可以保存为kbhit.c并在Linux和OS X上编译

 gcc -o kbhit kbhit.c 

运行时

 ./kbhit 

它会提示您进行按键操作,并在按键(不限于input或可打印键)时退出。

@Johnsyweb – 请详细说明你的意思是“详细的规范答案”和“所有的关注”。 此外,重新“跨平台”:使用这个实现的kbhit()你可以在Linux / Unix / OS X / Windows上的C ++程序中具有相同的function – 您可能指的是其他平台?

@Johnsyweb的进一步更新: C ++应用程序不是生活在密封的C ++环境中。 C ++的成功的一个重要原因是与C的互操作性。所有的主stream平台都是用C接口实现的(即使内部实现是使用C ++),所以你对“遗留”的讨论似乎不合适。 另外,正如我们正在谈论的一个单一的function,为什么你需要C ++(“类与C”)? 正如我所指出的那样,您可以用C ++编写并轻松访问此function,而您的应用程序用户不太可能关心您是如何实现它的。

在Windows上:

 system("pause"); 

在Mac和Linux上:

 system("read"); 

将输出“按任意键继续…”,显然,等待任何按键被按下。 我希望那是你的意思

没有完全便携的解决scheme。

comp.lang.c常见问题解答19.1中有关于Windows,类Unix系统甚至MS-DOS和VMS的解决scheme。

一个快速和不完整的总结:

  • 你可以使用curses库; 调用cbreak()后跟getch() (不要与Windows特定的getch()函数混淆)。 请注意, curses一般会控制terminal,所以这可能是矫枉过正。
  • 您可以使用ioctl()来操作terminal设置。
  • 在符合POSIX的系统上, tcgetattr()tcsetattr()可能是更好的解决scheme。
  • 在Unix上,你可以使用system()来调用stty命令。
  • 在MS-DOS上,您可以使用getch()getche()
  • 在VMS(现在称为OpenVMS)上,屏幕pipe理( SMG$ )例程可能会诀窍。

所有这些C解决scheme都应该在C ++中同样适用。 我不知道任何C ++特定的解决scheme。

为了实现这个function,你可以使用在Windows和Linux(和我所知的MacOS)上实现的ncurses库。

我研究了你想达到的目标,因为我记得我也想做同样的事情。 受Vinay的启发,我写了一些对我有用的东西,我有点理解。 但是我不是专家,所以请小心。

我不知道Vinay如何知道你使用的是Mac OS X,但是它应该和大多数类似Unix的操作系统一样。 真正有用的资源是opengroup.org

使用该function之前,请确保清空缓冲区。

 #include <stdio.h> #include <termios.h> //termios, TCSANOW, ECHO, ICANON #include <unistd.h> //STDIN_FILENO void pressKey() { //the struct termios stores all kinds of flags which can manipulate the I/O Interface //I have an old one to save the old settings and a new static struct termios oldt, newt; printf("Press key to continue....\n"); //tcgetattr gets the parameters of the current terminal //STDIN_FILENO will tell tcgetattr that it should write the settings // of stdin to oldt tcgetattr( STDIN_FILENO, &oldt); //now the settings will be copied newt = oldt; //two of the c_lflag will be turned off //ECHO which is responsible for displaying the input of the user in the terminal //ICANON is the essential one! Normally this takes care that one line at a time will be processed //that means it will return if it sees a "\n" or an EOF or an EOL newt.c_lflag &= ~(ICANON | ECHO ); //Those new settings will be set to STDIN //TCSANOW tells tcsetattr to change attributes immediately. tcsetattr( STDIN_FILENO, TCSANOW, &newt); //now the char wil be requested getchar(); //the old settings will be written back to STDIN tcsetattr( STDIN_FILENO, TCSANOW, &oldt); } int main(void) { pressKey(); printf("END\n"); return 0; } 

O_NONBLOCK似乎也是一个重要的标志,但它并没有改变我的任何东西。

如果有更深层次的知识的人会对此发表评论并提出一些build议,我很感激。

你可以使用微软特定的函数_getch :

 #include <iostream> #include <conio.h> // ... // ... // ... cout << "Press any key to continue..." << endl; _getch(); cout << "Something" << endl; 

这很简单。 我做了一个程序,它的工作完美..这是这个程序。

 #include<iostream.h> #include<conio.h> void check() { char chk; int j; cout<<"\n\nPress any key to continue..."; chk=getch(); j=chk; for(int i=1;i<=256;i++) if(i==j) break; clrscr(); } void main() { clrscr(); check(); cout<<"\n\nSee, Its Working....Have a Good day"; getch(); } 

这在Windows平台上工作:它直接使用微处理器寄存器,可用于检查按键或鼠标button

  #include<stdio.h> #include<conio.h> #include<dos.h> void main() { clrscr(); union REGS in,out; in.h.ah=0x00; printf("Press any key : "); int86(0x16,&in,&out); printf("Ascii : %d\n",out.h.al); char ch = out.h.al; printf("Charcter Pressed : %c",&ch); printf("Scan code : %d",out.h.ah); getch(); } 

您可以使用getchar例程。

从上面的链接:

 /* getchar example : typewriter */ #include <stdio.h> int main () { char c; puts ("Enter text. Include a dot ('.') in a sentence to exit:"); do { c=getchar(); putchar (c); } while (c != '.'); return 0; } 

如果您使用的是Visual Studio 2012或更早版本,请使用“getch()”函数,如果您使用的是Visual Studio 2013或更新版本,请使用“_getch()”。 你将不得不使用“#include <conio.h>”。 例:

 #include "stdafx" #include <iostream> #include <conio.h> int main() { std::cout << "Press any key to continue. . .\n" _getch() //Or "getch()" } 

你也可以使用conio.h中的getch()。 像这样:

 ...includes, defines etc void main() { //operator getch(); //now this function is waiting for any key press. When you have pressed its just //finish and next line of code will be called } 

所以,因为UNIX没有conio.h,所以我们可以用这个代码来模拟getch(),但是这个代码已经被Vinary写了,我的失败了):

 #include <stdio.h> #include <termios.h> #include <unistd.h> int mygetch( ) { struct termios oldt, newt; int ch; tcgetattr( STDIN_FILENO, &oldt ); newt = oldt; newt.c_lflag &= ~( ICANON | ECHO ); tcsetattr( STDIN_FILENO, TCSANOW, &newt ); ch = getchar(); tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); return ch; } 

您可以使用Scannervariables,并使用HasNext()方法。 然后打破它,并退出使用函数exit();

 import java.util.Scanner; public class exit_onClick { public static int exit() { return 0; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("Press Any Key to EXIT...."); int c=0; while(scan.hasNext()) { c++; if(c==1) break; } exit(); } } 
 #include <iostream> using namespace std; int main () { bool boolean; boolean = true; if (boolean == true) { cout << "press any key to continue"; cin >> boolean; } return 0; } 

如果您现在在MSDN上查找kbhit()函数,则表示该函数已被弃用。 使用_kbhit()来代替。

 #include <conio.h> int main() { _kbhit(); return 0; } 

只要使用system("pause"); 命令。

所有其他答案使问题复杂化。