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

while循环中的C++ STD CIN错误,c++,std,cin,while-loop,C++,Std,Cin,While Loop,为什么当我进入下面的循环并在第一条指令中键入某些内容时 cmdstd:getlinestd::cin,cmdInput;不读取输入的内容。例如,如果我输入了b8,它应该显示cmd是b8,但它会跳到下一个读取std::getlinestd::cin,input;并显示为b while (editingMode == TRUE) { std::getline(std::cin, cmdInput); istringstream cmdiss(cmdInput); cout

为什么当我进入下面的循环并在第一条指令中键入某些内容时 cmdstd:getlinestd::cin,cmdInput;不读取输入的内容。例如,如果我输入了b8,它应该显示cmd是b8,但它会跳到下一个读取std::getlinestd::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);
    }

你确定editingMode是真的吗?

你确定editingMode是真的吗?

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

这两个部分的作用相同:

将一行读入字符串 从该行创建一个istream 将该istream中的单词读入一个名为“tokens”的字符串数组 打印第一个单词
显然,tokens.at0是第一个单词。如果要查找8之类的参数,请检查tokens.size或迭代tokens。

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

这两个部分的作用相同:

将一行读入字符串 从该行创建一个istream 将该istream中的单词读入一个名为“tokens”的字符串数组 打印第一个单词
显然,tokens.at0是第一个单词。如果要查找8之类的参数,请检查tokens.size或遍历tokens。

也许输入缓冲区中有一个换行符,来自以前的输入?这是一个常见的错误

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


然后,当您的程序继续使用getlinecin、cmdline读取完整的一行时,它将读取仅由剩余的换行符组成的非常短的一行。这看起来像是程序跳转到下一次读取。

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

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

然后,当您的程序继续使用getlinecin、cmdline读取完整的一行时,它将读取仅由剩余的换行符组成的非常短的一行。这看起来像是程序跳转到下一次读取。

问题是将>>提取与getline混合,在缓冲区中留下换行符或其他输入。盲目使用ignore将隐藏逻辑错误,例如输入42 abc,然后输入cin>>某些int;忽略。。。;。您真正需要做的是提取空白行:

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;
}
谢天谢地,这是:

问题是将>>提取与getline混合,在缓冲区中留下换行符或其他输入。盲目使用ignore将隐藏逻辑错误,例如输入42 abc,然后输入cin>>某些int;忽略。。。;。您真正需要做的是提取空白行:

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;
}
谢天谢地,这是:


很可能这就是问题所在。有关清除输入的信息,请参阅。我建议采用类似马丁·约克(Martin York)的回应,因为当它到达第一条新线时就会停止。很可能这就是问题所在。有关清除输入的信息,请参阅。我建议类似马丁·约克的回答,因为当它到达第一条新线时就会停止。