簡體   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