【问题标题】:C++ STD Cin error in while loopwhile循环中的C ++ STD Cin错误
【发布时间】:2009-11-16 19:33:57
【问题描述】:

为什么当我进入下面的循环并在第一条指令中输入内容时 cmdstd:getline(std::cin,cmdInput);不读取输入的输入。例如,如果我输入“b 8”,它应该显示“cmd is b 8”,但它会跳到下一个读取 std::getline(std::cin, input);而是显示“it is b”

while (editingMode == TRUE) {
    std::getline(std::cin, cmdInput); 
    istringstream cmdiss(cmdInput);
    cout << "you entered: " << cmdInput <<endl;
    if (cmdInput != "") {      
        copy(istream_iterator<string>(cmdiss), 
             istream_iterator<string>(), 
             back_inserter<vector<string> >(tokens));
        std::cout << "cmd is " <<tokens.at(0) << std::endl;
    }

    //*************************
    std::getline(std::cin, input);
    istringstream iss(input);
    if(input != ""){
        copy(istream_iterator<string>(iss), 
             istream_iterator<string>(), 
             back_inserter<vector<string> >(tokens));
        std::cout << "it is " << tokens.at(0) <<std::endl;
        createInstruction(tokens);
    }

【问题讨论】:

    标签: c++ std cin while-loop


    【解决方案1】:

    也许您在输入缓冲区中留下了一个来自较早输入的换行符?这是一个常见错误。

    假设您的程序首先使用 cin >> x 读取一个整数,然后使用 getline(cin, cmdline) 读取一行。用户键入一个整数,然后按 ENTER 键。 cin >> x 将读取整数,但 ENTER 键(解释为换行符)将留在输入缓冲区中。

    当您的程序继续使用 getline(cin, cmdline) 读取完整的行时,它将读取仅包含剩余换行符的非常短的行。这看起来像程序“跳到下一个读取”。

    【讨论】:

    • 这很可能是问题所在。有关清除输入的信息,请参阅stackoverflow.com/questions/257091/…。我建议类似 Martin York 的响应,因为它会在到达第一个换行符时停止。
    【解决方案2】:

    代码没有问题。它只是没有做您认为应该做的事情:) 如果您想打印输入的整行而不是第一个单词,请不要打印 tokens[0];打印输入行。

    两个部分都做同样的事情:

    1. 将一行读入字符串
    2. 从该行创建 istream
    3. 将 istream 中的单词读入名为“tokens”的字符串数组中
    4. 打印第一个单词

    tokens.at(0) 显然是第一个单词。如果你想寻找像“8”这样的参数,检查 tokens.size() 或迭代标记。

    【讨论】:

      【解决方案3】:

      你确定editingMode是TRUE吗?

      【讨论】:

        【解决方案4】:

        问题是将&gt;&gt; 提取与getline 混合在一起,在缓冲区中留下换行符(或其他输入)。盲目使用ignore会隐藏逻辑错误,比如输入"42 abc"后跟cin &gt;&gt; some_int; cin.ignore(...);。你真正要做的是“提取”空行:

        int main() {
          using namespace std;
          int n;
          string s;
        
          cout << "Enter a number: "
          cin >> n >> blankline; // <---
        
          if (cin) {
            cout << "Enter a line of text: ";
            getline(cin, s);
          }
        
          if (!cin) {
            clog << "Sorry, I can't do that.\n";
            return 1;
          else {
            cout << "Input successful, now processing values: " << n << s << '\n';
          }
          return 0;
        }
        

        谢天谢地,这是easy

        template<class C, class T>
        std::basic_istream<C,T>& 
        blankline(std::basic_istream<C,T>& s,
                  typename std::basic_istream<C,T>::char_type delim) {
          if (s) {
            typename std::basic_istream<C,T>::char_type input;
            if (!s.get(input) && s.eof()) {
              s.clear(s.eofbit);
            }
            else if (input != delim) {
              s.putback(input);
              s.setstate(s.failbit);
            }
          }
          return s;
        }
        
        template<class C, class T>
        std::basic_istream<C,T>& blankline(std::basic_istream<C,T>& s) {
          blankline(s, s.widen('\n'));
          return s;
        }
        

        【讨论】:

          猜你喜欢
          • 2020-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-27
          • 1970-01-01
          • 2017-06-21
          • 2021-06-27
          相关资源
          最近更新 更多