用于Mac / Linux崩溃的Windows getch()相当于

我正在使用getch() ,我的应用程序立即崩溃。 包括做什么时:

 int main() { getch(); } 

我找不到链接,但据说问题是它需要关闭缓冲或这些线路上的一些奇怪的东西,我仍然希望cout与跨平台代码一起工作。

我被告知要使用std::cin.get() ,但我希望应用程序在按下某个键时退出,而不是当用户输入一个字母或数字然后按Enter键退出时。

这有什么function吗? 代码必须在Mac(我的操作系统)和Windows下运行。


链接/编译不是问题 ; 我包含并在XCode中链接-lcurses ,而Windows使用

您是否查看过以查看getch()函数的作用?

提示:OSX和Linux与Windows不同。

具体来说,作为的宏,我们发现:

 #define getch() wgetch(stdscr) 

现在,在你的系统上,在curses库中出现了一个实际的函数getch() ,但是它需要设置stdscr ,这是由curses初始化函数( initscr()和relatives)完成的,并且信号完全不是由您的代码完成的。 因此,您的代码通过在正确的初始化完成之前调用curses例程来调用未定义的行为,从而导致崩溃。

(来自dmckee的好提示 – 它有助于从acidzombie24中获取链接线,这很重要。)

为了达到可以读取单个击键并且程序干净地终止的程度,你必须在Unix(OSX,Linux)上做大量的工作。 您必须捕获终端的初始状态,安排atexit()函数 – 或某些类似的机制 – 来恢复终端的状态,将终端从熟化模式更改为原始模式,然后调用函数来读取字符(可能只是read(0, &c, 1) ),并退出。 可能还有其他方法可以做到 – 但肯定会涉及一些设置和拆卸操作。

一本可能有用的书是高级Unix编程, Mark Rochkind的第二版 ; 它涵盖了所需级别的终端处理。 或者,您可以正确使用 – 这比自己动手解决方案更简单,并且可能更可靠。

你没有展出过

 #include  

要么

 #include  

或类似的路线。 您确定要链接包含 getch()的库吗?

使用cin.get()函数例如:

 #include  using namespace std; int main() { char input = cin.get(); cout << "You Pressed: " << input; } 

然后程序会等你按一个键。

一旦你有,你按下的键将被打印到屏幕上。

getch函数在类Unix系统上不可用,但您可以通过编译器使用system函数将其替换为控制台命令。

用法:

在Windows中,您可以使用system("pause");

在类Unix系统(如OSX)中,您可以使用system("read -n1 -p ' ' key");

注意: system声明。