繁体   English   中英

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

[英]C++ cin.ignore and getline in while loop

我对编程很新,而且我在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;
}

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

您还应该将ignore参数传递给忽略所有内容,直到您输入换行符,以防它们输入的内容超过“是”或“否”。 你可以这样做:

cin.ignore(numeric_limits<streamsize>::max(), '\n');

在这里查看一个工作示例: ideone

我看到的问题是,当您删除cin.ignore()时,您将获得如下交互:

输入课程名称:数学

数学

继续('是'还是'否')?

输入课程名称:

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

第二次它没有提示你输入课程。 这是因为用于提交信息的Enter / Return是由getline()提取的, 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)          
      }
  }

如果你使用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';
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM