c++ - 从 std::cout 中删除最后一个值

标签 c++ c++11

我正在为两个玩家创建一个猜谜游戏。我首先希望用户输入一个数字,这是保密的。为了保密,我想删除用户最后输入 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/

相关文章:

c++ - 如何按值从 vector 中删除元素但仅删除该值的单个实例?

c++ - Makefile 不会将 .o 文件放在构建文件夹中

c++ - 使用 QFile::readAll 函数时如何避免读取 "\n"

c++ - 定义专用模板类构造函数时避免重复

c++ - 在派生模板类中重新实现基类的虚函数

c++ - std::unordered_map<int, std::vector<Element>> 上的迭代器

C++11 原子内存排序 - 这是宽松(释放-消费)排序的正确用法吗?

c++ - STL 容器迭代器的模板特化?

c# - C# 中的访问级别

c++ - 在以下程序中出现编译链接错误