用于Mac / Linux崩溃的Windows getch()相当于
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于Mac / Linux崩溃的Windows getch()相当于相关的知识,希望对你有一定的参考价值。
我正在使用getch()
,我的应用程序立即崩溃。包括做什么时:
int main()
{
getch();
}
我找不到链接,但据说问题是它需要关闭缓冲或这些线路上的一些奇怪的东西,我仍然希望cout
与跨平台代码一起工作。
我被告知要使用std::cin.get()
,但我希望应用程序在按下某个键时退出,而不是当用户输入一个字母或数字然后按回车键退出。
这有什么功能吗?代码必须在Mac(我的操作系统)和Windows下运行。
链接/编译不是issue;我在XCode中包含<curses.h>
并与-lcurses
链接,而Windows使用<conio.h>
。
你有没有看过<curses.h>
看看getch()
功能有什么作用?
提示:OSX和Linux与Windows不同。
具体来说,作为<curses.h>
中的一个宏,我们发现:
#define getch() wgetch(stdscr)
现在,在你的系统上,在curses库中出现了一个实际的函数getch()
,但是它需要设置stdscr
,这是由curses初始化函数(initscr()
和relatives)完成的,这是完全没有做到的通过你的代码。因此,您的代码通过在完成正确的初始化之前调用curses例程来调用未定义的行为,从而导致崩溃。
(来自dmckee的好提示 - 它有助于从acidzombie24中获取链接线,这很重要。)
为了达到可以读取单个击键并且程序干净地终止的程度,你必须在Unix(OSX,Linux)上做大量的工作。你必须捕获终端的初始状态,安排一个atexit()
函数 - 或一些类似的机制 - 来恢复终端的状态,将终端从熟模式更改为原始模式,然后调用一个函数来读取一个字符(可能只是read(0, &c, 1)
),并退出。可能还有其他方法可以做到 - 但肯定会涉及一些设置和拆卸操作。
一本可能有用的书是Mark Rochkind的Advanced Unix Programming, 2nd Edn;它涵盖了所需级别的终端处理。或者,您可以正确使用<curses.h>
- 这将比自己动手解决方案更简单,并且可能更可靠。
你没有展出过
#include <stdio.h>
要么
#include <curses.h>
或类似的线。您确定要链接到包含getch()
的库吗?
使用cin.get()函数例如:
#include <iostream>
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
在<stdlib.h>
中声明。
以上是关于用于Mac / Linux崩溃的Windows getch()相当于的主要内容,如果未能解决你的问题,请参考以下文章
用于 GCC/G++ 的宏来区分 Linux 和 Mac OSX?
OpenGL ES 2.0 适用于 Windows 和 Linux,但不适用于 Mac
网站的 javascript 适用于 android、windows、linux 和所有浏览器,但不适用于 mac、ios 在任何浏览器上