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-getcpan这样的安装程序通常会执行此操作)-但它们通常会读取一行输入并检查第一个字符。或者,对于某些剧烈的操作,它们可能需要您输入整个单词“yes”,然后按Enter(您不想重新格式化硬盘驱动器,因为您不小心按下了键)。

当然,许多程序(文本编辑器,文件查看器)都读取单字符非回声输入,但是此类程序倾向于基于诅咒。他们控制整个终端窗口。

最后,许多程序都具有GUI界面(Web浏览器等)。他们甚至可能没有读过stdin。

大多数生产Unix程序不使用或不需要Press any key to exit提示。他们只是默默地做自己的工作,然后辞职,这样您就可以做下一件事。基本上需要相对基础的程序,例如家庭作业。并不是说作业分配有什么问题,但是整个系统并不是主要为支持这种用法而设计的。

关于c - 为什么在按下任意键之前getch()返回?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7410447/

10-12 16:01