在C语言中,我通常使用getch()
函数等待按键并结束程序,但最近我读到说这不是一个标准函数,使用它是一种不良的编程实践。
所以,不要再使用以下代码:
int main() {
dosomething();
getch(); //wait for the user to see the results and press a key to end
return 0;
}
我该如何替换getch
?
在C语言中,我通常使用getch()
函数等待按键并结束程序,但最近我读到说这不是一个标准函数,使用它是一种不良的编程实践。
所以,不要再使用以下代码:
int main() {
dosomething();
getch(); //wait for the user to see the results and press a key to end
return 0;
}
我该如何替换getch
?
getc(stdin);
在这个意义上是可移植的。
使用非标准的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;
}
getchar()
是标准的,但由于行缓冲,您仍需要在 getchar
返回之前按下 Enter
。
我更喜欢从命令行运行程序。
Code::Blocks
,程序执行后终端窗口仍然保留显示:http://www.codeblocks.org/ - Andreas Grech我认为在保持控制台窗口不关闭方面,使用getch()是最常见的方法,但在C++中,大多数有经验的程序员会建议您使用cin.get。
std::cin.get();
改为:
getch();
getch()
在那里被广泛使用。C:> executable.exe
Linux:
~$ ./exec
你可以使用getchar()
,唯一的问题是它是带缓冲区的。而getch()
则没有缓冲区。你可以将getchar()
设置为非缓冲区,但是这个代码不值得去尝试。我曾经尝试过一次,但由于其极度复杂性,再也没有尝试过。
system("pause");
system("pause");
在标准中是什么?Andreas想让他的程序更加标准化,而不是依赖于特定的操作系统。 - pmg仅尝试回答一些不同的问题,您可以使用
while(1)
sleep(10);
在主函数结尾处(return 0;
之前)添加,并且然后您可以按ctrl-c来终止程序。我认为您不应该面临可移植性问题,而且我希望这也不是糟糕的编程实践:)
choice /c ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 /d y /t 10 /n /m "按任意字母或数字键继续"
。 - Adisak