11

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

int main()
{
    getch();
}

我找不到链接,但据说问题是它需要关闭缓冲或沿着这些线奇怪的东西,我仍然想cout使用跨平台代码。

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

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


链接/编译不是问题;我在 XCode 中包含<curses.h>并链接 with ,而 Windows 使用.-lcurses<conio.h>

4

4 回答 4

13

您是否查看过<curses.h>getch()功能的作用?

提示:OSX 和 Linux 与 Windows 不同。

具体来说,作为 中的宏<curses.h>,我们发现:

#define getch() wgetch(stdscr)

现在,在您的系统上,getch()curses 库中似乎有一个实际函数,但它希望stdscr被设置,这是由 curses 初始化函数(initscr()和亲属)完成的,而这显然不是由您的代码完成的. 因此,您的代码通过在正确初始化完成之前调用 curses 例程来调用未定义的行为,从而导致崩溃。

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

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

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

于 2008-11-06T01:13:17.547 回答
2

你没有展示过

#include <stdio.h>

或者

#include <curses.h>

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

于 2008-11-06T00:29:52.860 回答
1

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

#include <iostream>

using namespace std;

int main()
{
  char input = cin.get();

  cout << "You Pressed: " << input;
}

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

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

于 2017-06-21T23:23:32.200 回答
-1

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

用法:

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

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

注意:system<stdlib.h>.

于 2013-06-27T22:19:02.107 回答