int main(int argc,char *argv[],char *env[]) { printf("Press any key to exit.\n"); getch(); return 0; }
根据手册页,
getch
should wait until any key is pressed
…但实际上它直接返回之前按任何键. (返回值为-1).
为什么?
更新
我在Linux上如何实现按任意键退出,如果不使用getch()?
getchar()只会在回车后返回,这不是我想要的.
解决方法
int c; printf("Press <enter> to quit: "); fflush(stdout); while ((c = getchar()) != '\n' && c != EOF) { /* nothing */ }
如果您真的希望用户能够按任意键,而不只是输入,您可以这样做:
system("stty cbreak -echo"); getchar(); system("stty cooked echo");
第二个目的是将tty恢复到合理的设置(它应该真正恢复到任何状态,但保存和恢复状态有点复杂).可能有更清洁的方法来执行(使用stty程序本身使用的任何库函数).
编辑:阅读单个字符而不等待输入是一个常见问题.其实这是comp.lang.c FAQ的问题19.1.
编辑2:我最近没有做过很多诅咒的工作,但是我刚刚做了一些玩耍.看起来,getch()将不起作用,除非你先调用initscr() – 并且initscr()清除屏幕.诅咒旨在用于需要完全控制显示的文本编辑器等应用程序.可能有一种方法可以使用getch()而不控制屏幕,但是我没有找到它.
系统(“stty …”)可能实际上是最好的方法.
EDIT3:另一个答案中的termios解决方案可能是最好的(系统(“stty …”)更简单,但是调用外部程序感觉像是过度杀毒.
对于OP的评论“我不能相信按任何键退出,在c中这么麻烦”,是的,这似乎是奇怪的 – 但进一步的想法是有正当理由的.
看看安装在典型的Unix或Linux系统上的程序.我想你会发现很少有人需要这种输入(等待一个按键).
很多程序使用命令行参数和从文件或从stdin读取的数据.用户输入的任何内容都是输入数据,而不是提示的命令或响应.
一些程序确实要求确认一些操作(apt-get和cpan这样的安装程序经常这样做) – 但是它们通常会读取一行输入并检查第一个字符.或者,对于一些激烈的行动,他们可能需要您输入整个单词“是”,然后输入(您不想重新格式化您的硬盘驱动器,因为您不小心打了一个键).
当然,很多程序(文本编辑器,文件查看器)都读取单字符的非回调输入,但这样的程序往往是基于curses的;他们控制整个终端窗口.
最后,一些程序有GUI界面(网络浏览器等);他们可能甚至不从stdin读书.
大多数生产的Unix程序不使用或需要按任意键退出提示.他们只是通常默默地做自己的工作,然后终止,所以你可以做下一件事情.这个需求在很大程度上适用于相对基本的课程,如作业分配.不是家庭作业有任何错误,而是整个系统并不是主要用于支持这种使用.