C ++ cin.ignore和getline in while循环

时间:2018-04-26 22:34:56

标签: c++

我对编程很新,而且我在while循环中使用getline时遇到了麻烦。当我输出课程变量时,第一个字母丢失了。摆脱cin.ignore将其发送到无限循环中。

这是我到目前为止所拥有的:

#include <iostream>
#include <string>
using namespace std;
int main (){
   string answer = "Yes";
   string course;

   while (answer == "Yes"){
      cin.ignore();
      cout<< "Enter a course name: ";
      getline (cin, course);
      cout<< course << endl;

      cout<< "Continue ('Yes' or 'No')? ";
      cin>> answer;
      cout<< answer << endl;
   }

   return 0;
}

3 个答案:

答案 0 :(得分:4)

ignore移动到循环的底部。它可以删除cin >>运算符在缓冲区中留下的换行符,因此只有在使用cin >>后才需要它。

您还应该将参数传递给ignore以忽略所有内容,直到您输入换行符,以防他们输入的内容不仅仅是“是”或“否”。你可以用:

来做到这一点
cin.ignore(numeric_limits<streamsize>::max(), '\n');

请在此处查看工作示例:ideone

答案 1 :(得分:2)

我看到的问题是当你删除cin.ignore()后,你会得到以下互动:

  

输入课程名称:数学

     

数学

     

继续('是'或'否')?是的

     

     

输入课程名称:

     

继续('是'或'否')?是的//等等......

第二次它没有提示你输入课程。 这是因为您用来提交信息的输入/返回是由getline()提取的,它会在它看到的第一个'\ n'字符处停止。

修复它的一种方法是在自定义输入后使用cin.ignore()。 请注意,如果从文件中读取,则应该在课程输入后结束行以获得与此处相同的结果。

  while (answer == "Yes"){
                                     // REMOVE cin.ignore() FROM HERE
      cout<< "Enter a course name: ";
      getline (cin, course);
      cout<< course << endl;

      cout<< "Continue ('Yes' or 'No')? ";
      cin>> answer;
      cout<< answer << endl;

      {    // THIS IS MORE EFFICIENT
           cin.ignore();                // ADD cin.ignore() HERE TO DISCARD '\n'
      }

      {   // THIS WORKS BETTER FOR HUMAN INPUT
          string dummy;
          getline (cin, dummy)          
      }
  }

答案 2 :(得分:2)

如果您使用getline,请坚持getline。将它与流操作混合将很容易搞砸。

#include <iostream>
#include <string>

int main() {
  std::string answer = "Yes";
  std::string course;

  while (answer == "Yes") {
    do {
      std::cout << "Enter a course name: ";
      std::getline(std::cin, course);
    } while (course == "");

    std::cout << course << '\n';

    do {
      std::cout << "Continue ('Yes' or 'No')? ";
      std::getline(std::cin, answer);
    } while (answer != "Yes" && answer != "No");

    std::cout << answer << '\n';
  }
}