相当于Windows getch()for Mac/Linux crashes

vsikbqxv  于 2023-04-05  发布在  Windows
关注(0)|答案(5)|浏览(125)

我正在使用getch(),我的应用程序立即崩溃。包括在执行以下操作时:

int main()
{
    getch();
}

我找不到链接,但据推测,问题是它需要关闭缓冲或其他奇怪的东西,我仍然希望cout与跨平台代码一起工作。
我被告知使用std::cin.get(),但我希望应用程序在按下一个键时退出,而不是在用户键入一个字母或数字后按回车键退出。
这个有什么功能吗?代码必须在Mac(我的os)和Windows下工作。
链接/编译不是问题;我在XCode中包含<curses.h>并与-lcurses链接,而Windows使用<conio.h>

erhoui1w

erhoui1w1#

你有没有在<curses.h>中查看过getch()函数是做什么的?
提示:OSX和Linux与Windows不同。
具体来说,作为<curses.h>中的宏,我们发现:

#define getch() wgetch(stdscr)

现在,在您的系统上,curses库中出现了一个实际的函数getch(),但它需要设置stdscr,这是由curses初始化函数完成的。(initscr()和relatively),而这显然不是你的代码所做的。所以,你的代码在正确的初始化完成之前,通过调用curses例程来调用未定义的行为,导致了坠机
(Good来自dmckee的提示-它帮助把链接行从acidzombie 24中拿出来,这很重要。)
要达到一个点,即可以读取一个击键,并且程序可以干净地终止,您必须在Unix上做大量的工作(OSX,Linux)。你必须捕获终端的初始状态,安排一个atexit()函数-或一些类似的机制-来恢复终端的状态,将终端从熟模式更改为原始模式,然后调用一个函数来读取一个字符(可能只是read(0, &c, 1)),并执行退出。可能还有其他方法来执行它-但肯定会涉及一些设置和拆除操作。
马克·罗奇金德(Mark Rochkind)的《Advanced Unix Programming, 2nd Edn》一书可能会有所帮助;另外,你也可以正确地使用<curses.h>--这将比你自己的解决方案更简单,而且可能更可靠。

iyzzxitl

iyzzxitl2#

你没有表现出

#include <stdio.h>

#include <curses.h>

或类似的行。你确定你链接的库包含getch()吗?

xqkwcwgp

xqkwcwgp3#

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

#include <iostream>

using namespace std;

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

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

然后程序会等待您按下一个键。
一旦你有,你按下的键将被打印到屏幕上。

erhoui1w

erhoui1w4#

你可以使用stty在类unix系统上设置raw模式输入:

#include <stdio.h>
#include <stdlib.h>

int main() {

    // for unix
    system("stty raw");

    while (1) {
        char c = getchar();
        // use e to exit
        if(c == 'e') {
            system("stty cooked");
            exit(0);
        } else {
            for (int i = 0;i < 10;i++)
                printf("%c ",c);
        }
    }

    return 0;
}

不要忘记使用system(stty cooked)将其设置回来,否则您的终端将表现得很奇怪。

rggaifut

rggaifut5#

getch函数在类Unix系统上不可用,但您可以使用system函数通过编译器用控制台命令替换它。
使用方法:
在Windows中,可以使用system("pause");
在类Unix系统(如OSX)中,可以使用system("read -n1 -p ' ' key");
注意:system<stdlib.h>中声明。

相关问题