【问题标题】:How To Stop C++ From Repeating Itself? [duplicate]如何阻止 C++ 重复自己? [复制]
【发布时间】:2021-12-30 10:49:40
【问题描述】:

抱歉这个问题很糟糕,但我真的不知道发生了什么。

while (true) {
        string choice;
        cout << ">>> ";
        cin >> choice;
        if (choice == "hi") {
                cout << "Whats up?" << endl;
        } else {
                cout << "error" << endl;
        }
}

如果我编译这个然后输入“hi”它会显示

>>> hi
Whats up?
>>> 

但如果我说“嗨嗨”

>>> hi hi
Whats up?
>>> Whats up?
>>> 

它会证明这一点。为什么会显示Whats up?两次而不是错误消息?

【问题讨论】:

  • 输入运算符&gt;&gt; 读取空格分隔“单词”。如果你想阅读行使用std::getline
  • 另一个相关的question

标签: c++


【解决方案1】:

问题std::cin用于读取与变量类型兼容的数字或单个字 em> 一次。 从技术上讲,您使用的是格式化输入 operator&gt;&gt;,它丢弃前导空格,并且在遇到空格/无效输入时也会停止读取。

解决此问题,请将cin &gt;&gt; choice; 替换为:

std::getline(cin, choice);

这会一直读取到遇到'\n',现在我们正在使用未格式化的输入

所以,修改后的代码如下:

while (true) {
    string choice;
    cout << ">>> ";
    std::getline(cin, choice);//i modified this 
    if (choice == "hi") {
        cout << "Whats up?" << endl;
    } else {
        cout << "error" << endl;
    }
}

你可以试试代码here

【讨论】:

    【解决方案2】:

    一旦std::cin 读取了一个空格字符(这个' '),它就不会再将该空格字符之后的任何字符视为输入的一部分。所以下次它读取缓冲区时,它将读取第二个“hi”并将其插入choice。就像您正在输入“hi”并按回车键然后再次执行此操作。你会看到“怎么了?”被打印两次。

    使用std::getline(std::cin, choice); 获取完整输入,即使其他字符之间存在空格或制表符。

    如果您想要更安全的错误,那么此功能可能会有所帮助:

    
    #include <iostream>
    #include <limits>
    
    
    void getCharInput( char arr[], const std::streamsize streamSize )
    {
        std::cin.putback( '\n' );
        std::cin.clear( );
        std::cin.ignore( std::numeric_limits<std::streamsize>::max( ), '\n' );
        std::cin.getline( arr, streamSize );
    }
    
    int main()
    {
        constexpr std::streamsize streamSize { 11 }; // 11 as an example ( 10 for actual chars plus 1 for '\0' )
        char inputBuffer[ streamSize ] { };
    
        getCharInput( inputBuffer, streamSize );
    
        std::cout << "Input is: <" << inputBuffer << ">" << '\n';
    }
    
    

    只有 11 chars(包括空终止符'\0')将被读取并存储在inputBuffer中。

    【讨论】:

      猜你喜欢
      • 2014-09-04
      • 1970-01-01
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2022-06-30
      • 2014-06-26
      相关资源
      最近更新 更多