我正在为两个玩家创建一个猜谜游戏。我首先希望用户输入一个数字,这是保密的。为了保密,我想删除用户最后输入 cin 的所有内容。我试图将光标移回并在用户输入数字的地方插入一个空格。我正在尝试使用 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
目前这只是打印另一行,以空格作为第一个字符,而不是返回到上一行并将用户输入的整数替换为“”。
请不要给我任何操作系统特定的解决方案,我需要它在 windows 和 linux 上编译。
最佳答案
如果您的终端仿真器(或您在 Windows 上使用的命令 shell)支持基本的 ANSI 控制字符,您可以输出反向换行序列,然后是终止行序列。反向换行是必要的,因为用户将键入回车以终止输入,因此光标不再位于同一行。这些代码分别是 "\033[F"
和 "\033[K"
。但不能保证这会奏效。
从历史上看,您可以使用现已撤销的 Posix 接口(interface) getpass
读取一行而不回显。我不相信它是由 Windows 实现的,虽然它仍然是 glibc
的一部分,但不鼓励使用它。不幸的是,没有标准的替代品。
使用 termios
工具在 Posix 系统中可以使用独立于控制台的终端控制;基本上,您只需要关闭 ECHO
标志。 (有关更多详细信息,请参见 man termios
。)在 Windows 上,有一个类似的界面。但是,使用这些接口(interface)很容易遇到麻烦,因为您需要重新启用回显,即使用户使用 ctl-C 终止程序(或暂停它)使用 ctl-Z)。做到这一点很棘手,而您在互联网上随处可见的幼稚解决方案通常不会。
话虽如此,请参阅 Getting a password in C without using getpass (3)?一些可能的解决方案。
关于c++ - 从 std::cout 中删除最后一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326483/