当前位置:  开发笔记 > 运维 > 正文

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

如何解决《用于Mac/Linux崩溃的Windowsgetch()相当于》经验,为你挑选了1个好方法。

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

int main()
{
    getch();
}

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

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

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


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



1> Jonathan Lef..:

你有没有看过这个getch()功能有什么作用?

提示:OSX和Linux与Windows不同.

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

#define getch() wgetch(stdscr)

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

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

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

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

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有