我正在尝试编写一个C++程序,当用户从键盘输入任何字符时,它应该移动到下一行代码.
这是我的代码:
char c; cin>>c; cout<<"Something"<但这不起作用,因为当我输入一些字符然后按ENTER键时它只会移动到下一行.
要么
如果我用这个
cin.get() or cin.get(c)按Enter键进入下一行指令.
但我希望它能够在键盘上按下的任何键上移动到下一行,如何做到这一点?
1> 小智..:在Windows上:
system("pause");在Mac和Linux上:
system("read");将输出"按任意键继续...",显然,等待按任何键.我希望那就是你的意思
忘了慢,它调用第一个名为"pause"的程序,碰巧在PATH中找到它,并给它调用程序的权限级别.即使您是学生只是测试自己的代码,它仍然是一个巨大的安全风险.
没错,但它只有一条线!有时,将计算机保存一段时间是不值得的.
@XDfaceme - pause是system()要求windows运行的实际程序.但是,如果有另一个名为'pause'的程序,并且Windows首先找到该程序,它将运行它.我想我可能会过分夸大其重要性,但是使用cin.get()并点击返回以暂停/取消暂停程序仍然更容易
`system`调用外部程序.您无需调用外部程序等待任何密钥!就像打电话给另一个人在你坐在它前面打开电脑一样 - 这是一个缓慢的解决方案.
2> Vinay Sajip..:如果您使用的是Windows,则可以使用
kbhit()
Microsoft运行时库中的一部分.如果您使用的是Linux,则可以实现kbhit
(源代码):#include#include #include #include 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(至少在OS X 10.5.8 - Leopard上,所以我希望它可以在更新版本的OS X上运行).这个要点可以
kbhit.c
在Linux和OS X上保存和编译gcc -o kbhit kbhit.c在运行时
./kbhit它会提示您输入按键,并在按键时退出(不限于Enter键或可打印键).
@Johnsyweb - 请详细说明"详细规范答案"和"所有问题"的含义.此外,重新"跨平台":通过这种实现,
kbhit()
您可以在Linux/Unix/OS X/Windows上的C++程序中具有相同的功能 - 您可能指的是其他平台?@Johnsyweb的进一步更新: C++应用程序并不存在于密封的C++环境中.C++成功的一个重要原因是与C的互操作性.所有主流平台都是用C接口实现的(即使内部实现使用的是C++),所以你对"遗留"的讨论似乎不合适.另外,在我们讨论单个函数时,为什么需要C++("C with classes")?正如我所指出的,您可以使用C++编写并轻松访问此功能,而您的应用程序的用户不太关心您是如何实现它的.
@Johnsyweb:我知道RAII及其带来的好处,我自己就是一个古老的C++手.我的观点仍然存在:声明与幕后工作之间没有明确的联系.虽然它可能使用闪亮的C++习语而不是普通的旧C语言,但我的观点是它没有什么可以照亮的,而且很难掩盖正在发生的事情.这不是以任何方式针对您个人 - 这只是关于如何使用C++来创建不必要的难以理解的代码的意见.我现在会离开我的肥皂盒,"努夫说.
3> Keith Thomps..:没有完全便携的解决方案.
comp.lang.c FAQ的问题19.1 涵盖了这个问题,包括Windows,类Unix系统甚至MS-DOS和VMS的解决方案.
快速而不完整的摘要:
你可以使用
curses
图书馆; 调用cbreak()
后跟getch()
(不要与Windows特定的getch()
功能混淆).注意,curses
通常控制终端,所以这可能是过度的.您可以使用它
ioctl()
来操纵终端设置.在POSIX兼容的系统,
tcgetattr()
并且tcsetattr()
可能是一个更好的解决方案.在Unix上,您可以使用它
system()
来调用stty
命令.在MS-DOS上,您可以使用
getch()
或getche()
.在VMS(现在称为OpenVMS)上,Screen Management(
SMG$
)例程可能会起作用.
所有这些C解决方案在C++中应该同样有效; 我不知道任何特定于C++的解决方案.
4> Kirill V. Ly..:要实现此功能,您可以使用ncurses库,该库在Windows和Linux(以及据我所知的MacOS)上实现.
然后,唯一的选择是为您计划支持的每个操作系统实现所需的功能.
5> 小智..:这很简单.我制作了一个程序,它的工作非常完美......这就是程序.
#include#include 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(); }