我正在为两名球员创造一个猜谜游戏。我首先希望用户输入一个号码,这是一个秘密。为了保密,我想删除用户最后输入的内容。我试图将光标向后移动并插入用户输入数字的空白区域。我现在正尝试使用cout << "\b" << "\b" << "\b" << " "
,您可以在下面的循环中看到。
到目前为止,这是我的代码:
do{ //initial do-while loop to begin game
int secretNumber = 0; //initilized to a default value of 0 to make the compiler happy
do {
//prompt user for input
cout << "Please choose a secret number between 1 and 10: ";
//read in user input
cin >> secretNumber; //store user input in variable
cout << "\b" << "\b" << "\b" << " "; //<------- this is my attempt to clear the user input
if(secretNumber <= 0 || secretNumber > 10){
cout << "You have attempted to enter a number outside of the acceptable range." << endl;
}
}while ((secretNumber <= 0 || secretNumber > 10)); //repeat do-while loop if user input is out of range
目前这只打印另一行,空格作为第一个字符,而不是回到上一行,并用&#34;替换用户输入的整数。 &#34;
请不要给我任何特定于操作系统的解决方案,我需要在windows和linux上进行编译。
答案 0 :(得分:2)
如果终端仿真器(或在Windows上使用的命令shell)支持基本的ANSI控制字符,则可以输出反向换行序列,然后输出终止行序列。反向换行是必要的,因为用户将键入回车以终止输入,因此光标不再在同一行上。这些代码分别为"\033[F"
和"\033[K"
。但不能保证这会奏效。
从历史上看,您可以使用现已撤消的Posix接口getpass
来读取一条没有回显的行。我不相信这是由Windows实现的,虽然它仍然是glibc
的一部分,但不建议使用它。不幸的是,没有标准的替代品。
使用termios
工具在Posix系统中提供与控制台无关的终端控制;基本上,你只需要关闭ECHO
标志。 (有关详细信息,请参阅man termios
。)在Windows上,有一个类似的界面。但是,使用这些接口很容易遇到麻烦,因为即使用户使用 ctl-C 杀死程序,你也需要重新启用回显(或暂停它与 ctl-Z )。做到这一点很棘手,你在互联网上找到的天真的解决方案通常都没有。
话虽如此,请参阅Getting a password in C without using getpass (3)?了解一些可能的解决方案。