擦除std :: cout中的最后一个值

时间:2014-10-12 15:01:06

标签: c++ c++11

我正在为两名球员创造一个猜谜游戏。我首先希望用户输入一个号码,这是一个秘密。为了保密,我想删除用户最后输入的内容。我试图将光标向后移动并插入用户输入数字的空白区域。我现在正尝试使用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上进行编译。

1 个答案:

答案 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)?了解一些可能的解决方案。