为什么getch()返回之前按任何键?

前端之家收集整理的这篇文章主要介绍了为什么getch()返回之前按任何键?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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()只会在回车后返回,这不是我想要的.

解决方法

在Linux上,getch()可能是curses函数,这与具有相同名称的Windows特定功能完全不同.诅咒(ncurses)可能是你想要做的事情.

最简单的方法是等到用户按Enter键,你可以这样做:

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程序不使用或需要按任意键退出提示.他们只是通常默默地做自己的工作,然后终止,所以你可以做下一件事情.这个需求在很大程度上适用于相对基本的课程,如作业分配.不是家庭作业有任何错误,而是整个系统并不是主要用于支持这种使用.

猜你在找的C&C++相关文章