int main(int argc, char *argv[], char *env[])
{
printf("Press any key to exit.\n");
getch();
return 0;
}
根据手册页,
...但实际上,它会在按任意键之前直接返回。 (返回的值为
-1
)。为什么?
更新
我在Linux上。如果不使用
Press any key to exit.
,如何实现getch()
?getchar()
仅在按Enter键后返回,这不是我想要的。 最佳答案
在Linux上,getch()
可能是curses
函数,它与Windows的同名特定函数完全不同。 curses
(ncurses
)可能对您想做的事有些过分。
最简单的方法是等到用户按下Enter键,您可以执行以下操作:
int c;
printf("Press <enter> to quit: ");
fflush(stdout);
while ((c = getchar()) != '\n' && c != EOF) {
/* nothing */
}
如果您确实希望用户能够按任意键,而不仅仅是Enter键,则可以执行以下操作:
system("stty cbreak -echo");
getchar();
system("stty cooked echo");
第二个
stty
旨在将tty恢复到合理的设置(它实际上应该将它们恢复到原来的状态,但是保存和恢复状态要稍微复杂一些)。可能有更干净的方法可以做到这一点(使用stty
程序本身使用的任何库函数)。编辑:无需等待Enter即可读取单个字符是一个常见问题。实际上,这是comp.lang.c FAQ中的问题19.1。
编辑2:我最近在诅咒方面还没有做很多工作,但是我只是在玩弄它而已。除非您先调用
getch()
,否则initscr()
似乎无法工作-且initscr()
会清除屏幕。 curses适用于需要完全控制显示的文本编辑器之类的应用程序。可能有一种无需控制屏幕即可使用getch()
的方法,但我没有找到它。system("stty ...")
合并实际上可能是最好的方法。编辑3:另一个答案中的
termios
解决方案可能是最好的(system("stty ...")
比较简单,但是调用外部程序感觉像是过大了。至于OP的评论“我不敢相信
Press any key to exit.
在c语言中做起来这么麻烦”,是的,这的确有些奇怪,但进一步的考虑有其合理的理由。看一看在典型的Unix或Linux系统上安装的程序。我想您会发现,其中很少有人需要这种输入(等待一次按键)。
许多程序使用命令行参数和从文件或从
stdin
读取的数据。用户输入的任何内容都是输入数据,而不是命令或对提示的响应。有些程序确实要求您确认某些操作(像
apt-get
和cpan
这样的安装程序通常会执行此操作)-但它们通常会读取一行输入并检查第一个字符。或者,对于某些剧烈的操作,它们可能需要您输入整个单词“yes”,然后按Enter(您不想重新格式化硬盘驱动器,因为您不小心按下了键)。当然,许多程序(文本编辑器,文件查看器)都读取单字符非回声输入,但是此类程序倾向于基于诅咒。他们控制整个终端窗口。
最后,许多程序都具有GUI界面(Web浏览器等)。他们甚至可能没有读过stdin。
大多数生产Unix程序不使用或不需要
Press any key to exit
提示。他们只是默默地做自己的工作,然后辞职,这样您就可以做下一件事。基本上需要相对基础的程序,例如家庭作业。并不是说作业分配有什么问题,但是整个系统并不是主要为支持这种用法而设计的。关于c - 为什么在按下任意键之前getch()返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7410447/