如何模拟“按任意键继续?”
我想写一个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");
命令。
所有其他答案使问题复杂化。