C语言:通过按键终止程序

5

在C语言中,我通常使用getch()函数等待按键并结束程序,但最近我读到说这不是一个标准函数,使用它是一种不良的编程实践。

所以,不要再使用以下代码:

int main() {
    dosomething();
    getch(); //wait for the user to see the results and press a key to end
    return 0;
}

我该如何替换getch ?


4
通常不建议在C程序中使用getch(),原因是:1.键盘输入没有传达任何信息,这通常被认为是糟糕的用户界面设计;2.它会破坏管道(现在在Windows下也运行得非常好,或者我听说是这样)。在cmd.exe下,考虑将您的C程序放在一个小的.bat文件中,并在结尾处加上“pause”命令。 - digitalarbeiter
如果你想在批处理文件中实现“超时”,你也可以使用choice命令:choice /c ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 /d y /t 10 /n /m "按任意字母或数字键继续" - Adisak
如果您想要“任意键”行为,那么在nix上,您可以使用ncurses来提供getch()给您,并使用getch。但是我+1了digitalarbeiter的评论-最近我不得不与某人的程序中的这个“按任意键”用法一起工作-我需要批处理模式下执行它。花了一些功夫才能说服程序我正在“按按钮”。 - Andrew Y
看看我对AlexKR答案的评论。 - Shimmy Weitzhandler
9个回答

8

getc(stdin); 在这个意义上是可移植的。


...但只留下一个键,可以按下相同的效果,就像使用getch()一样。 - Andrew Y
1
我认为这就是原帖作者想要的。 如果你想要获得大量用户响应的有效方法是:在你的代码中使用 #define GL puts("Press any key to continue..."); getc(stdin); 调用GL;。 - Shimmy Weitzhandler
顺便说一句,在C++中似乎不起作用,我尝试了getc(stdin),但它不会继续执行直到我按下Enter键。 - Shimmy Weitzhandler

4

使用非标准的I/O函数本身并不是坏实践;如果你打算将这段代码移植到不支持getch()的不同平台上,则会成为问题。

问题在于,没有标准库函数可以检测个别按键(getchar()fgetc()是缓冲的,并且需要在返回之前先按Enter键);因此,您需要使用一些非标准的东西来完成这项任务。如果您仅打算在特定平台上运行此代码,请使用getch(),如果需要,只需记住该解决方案不一定适用于其他平台。如果您打算将此代码移植到不支持getch()的平台上,请在封装函数后隔离系统特定调用,以便在移植代码时只需更改封装函数内部的代码即可。

int getKeystroke(void)
{
  /**
   * Put platform-specific call here
   */
  return getch();
}

int main(void)
{
  ... // do stuff here
  getKeystroke();
  return 0;
}

2
您可以将终端窗口固定,使其不会自动关闭。

@ndim:你是如何在Windows上实现这个的? - Lazer
上一次我查看时,在某个菜单中有一个相关的设置。 - ndim

1

getchar() 是标准的,但由于行缓冲,您仍需要在 getchar 返回之前按下 Enter


1

我更喜欢从命令行运行程序。


不要在调试器中运行代码,因为输出会消失。(个人建议设置断点...) - user172783
使用 Code::Blocks,程序执行后终端窗口仍然保留显示:http://www.codeblocks.org/ - Andreas Grech

1

我认为在保持控制台窗口不关闭方面,使用getch()是最常见的方法,但在C++中,大多数有经验的程序员会建议您使用cin.get。

 std::cin.get();

改为:

getch();

0
你正在使用Turbo C编译器吗?getch()在那里被广泛使用。
另一方面,如果你想让程序等待,请在shell/终端/prompt中运行二进制文件。导航到该目录并调用 Windows:
C:> executable.exe

Linux:

~$ ./exec

你可以使用getchar(),唯一的问题是它是带缓冲区的。而getch()则没有缓冲区。你可以将getchar()设置为非缓冲区,但是这个代码不值得去尝试。我曾经尝试过一次,但由于其极度复杂性,再也没有尝试过。


0
除了其他答案之外,如果您的意图是等待按键完成程序,您还可以在Windows中使用此方法:
system("pause");

1
system("pause"); 在标准中是什么?Andreas想让他的程序更加标准化,而不是依赖于特定的操作系统。 - pmg
我明确表示我的答案是针对Windows的。我还说我提供这个选项作为补充,并且可能是一个很好的使用案例。getch的问题不是特定于操作系统,而是特定于编译器。因此,不能因为提出另一种观点就将某人投票否决。 - user44556

0

仅尝试回答一些不同的问题,您可以使用

while(1) sleep(10);

在主函数结尾处(return 0;之前)添加,并且然后您可以按ctrl-c来终止程序。我认为您不应该面临可移植性问题,而且我希望这也不是糟糕的编程实践:)


@Andreas Grech,你认为哪一个答案最适合你? - Vinit Dhatrak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接