while循环中的C ++ STD Cin错误

时间:2009-11-16 19:33:57

标签: c++ std cin while-loop

为什么当我进入下面的循环并输入第一条指令时 cmdstd:函数getline(标准:: CIN,cmdInput);不读取输入的输入。例如,如果我输入“b 8”,它应显示“cmd is b 8”,但它会跳到下一个读取std :: getline(std :: cin,input);并显示“它是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);
    }

4 个答案:

答案 0 :(得分:3)

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

让我们说你的程序首先用 cin&gt;&gt;读取一个整数。 x ,然后是 getline(cin,cmdline)的行。用户键入一个整数,然后按ENTER键。 cin&gt;&gt; x 将读取整数,但解释为换行符的ENTER键将保留在输入缓冲区中。

当你的程序继续读取带有 getline(cin,cmdline)的完整一行时,它将读取由该左上线换行符组成的非常短的行。这看起来像程序“跳到下一个读取”。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

你确定editingMode是真的吗?

答案 3 :(得分:0)

问题是将>>提取与getline混合,在缓冲区中留下换行符(或其他输入)。盲目地使用忽略将隐藏逻辑错误,例如输入"42 abc"后跟cin >> 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;
}