我一直在使用非常非常古老的 Turbo C++ 3.0 编译器。
在使用这个编译器的过程中,我已经习惯了类似的函数getch()
,getche()
最重要的是clrscr()
。
现在我已经开始使用 Visual C++ 2010 Express。这导致了很多问题,因为大多数这些函数(我现在发现了)都是非标准的,并且在 Visual C++ 中不可用。
我现在该怎么办?
我一直在使用非常非常古老的 Turbo C++ 3.0 编译器。
在使用这个编译器的过程中,我已经习惯了类似的函数getch()
,getche()
最重要的是clrscr()
。
现在我已经开始使用 Visual C++ 2010 Express。这导致了很多问题,因为大多数这些函数(我现在发现了)都是非标准的,并且在 Visual C++ 中不可用。
我现在该怎么办?
如果可能,请始终尝试避免使用它们或尝试使用它们的替代方法:
for getch() --- cin.get()
clrscr -- system("cls") // try avoiding the system commands. check : [System][1]
对于任何其他人,您可以搜索它们。
真正的问题是你想要在全球范围内做什么。
getch
并且clrscr
从未便携过。如果您尝试在控制台窗口中创建掩码或菜单,您应该查看curses
or ncurses
:这些为此类事情提供了便携式解决方案。如果只是分页,您可能可以简单地输出大量'\n'
(for clrscr
) 和std::cin.get()
for getch
。(但请注意,这只会在用户输入新行后返回,并且只会读取该行的一个字符,将其余字符留在缓冲区中。绝对不是直接替换getch
. 事实上,
std::getline
或者std::cin::ignore
可能更好选择。)
添加更多可能性:
首先,正如 Joachim Pileborg 在他的评论中所建议的那样,如果可移植性是一个问题,那么您正在尝试做的大部分事情可能都有特定于平台的功能。如果您所关心的只是 Windows(它可能是,因为system(
"cls" )
并且getch()
在其他地方不起作用),那么他的评论可能是一个足够的答案。
其次,对于许多控制台(包括 xterm 和 Windows 下的控制台窗口),转义序列"\x1b""2J"
应该清除屏幕。(请注意,您必须将其作为两个单独的字符串文字输入,否则,它将被解释为两个字符,第一个字符的十六进制值不可能为 0x1b2。)但是,不要忘记可能出现的重定向和刷新问题。
最后,如果您正在做任何重要的事情,您应该研究一下curses
(或者ncurses
,它们是同一件事,但具有不同的实现)。付诸行动需要付出更多努力(您需要显式初始化等),但它有一个getch
功能可以完全满足您的需求,它还具有显式定位光标等功能,这也可能使您的代码更简单。(原版curses
是为了支持vi
UCB 的原版编辑器而开发的。任何没有在自己的窗口中开发的类似任务的编辑器都会从中受益匪浅。)
出色地,
伙计们,我找到了一种可以在任何地方使用的最佳解决方案。
我只是用谷歌搜索了 clrscr() 和 gotoxy() 的定义,并创建了一个头文件并将这些定义添加到其中。因此,我可以包含这个文件并做我之前做的所有事情。
但是,我也有疑问。
windows.h 在定义中。假设我编译该文件并制作一个 exe 文件。那么我可以在linux机器上运行它吗?
在我看来,答案必须是肯定的。但是,如果我错了,请告诉我,并告诉我为什么我错了。