使用 getline(cin, string) 时,cin 自动取值,无需询问

Posted

技术标签:

【中文标题】使用 getline(cin, string) 时,cin 自动取值,无需询问【英文标题】:when use getline(cin, string), cin automatically take its value without ask 【发布时间】:2015-03-10 04:50:34 【问题描述】:

以下代码仅在第一个 while 循环中不能正常工作,它会自动将值赋给 cin,所以我没有机会在下一个循环之前给它一个输入。为什么会这样?

char again = 'y';
while (again=='y')  
  int n=1 , chance = 5, score = 0, level = 1;
  if (n == 1) 
    cout << "Game begin!"<<endl;
  while (chance) 
    cout << "You have " << chance << " chances left." << endl;
    cout<<"level "<<level<<" question!"<<endl;
    vector<string> actorset = game(graph,level);
    int correct = 0;
    string s;
    cout << "\nyour answer is:";
    std::getline(cin, s);
    cout << "Your Answer is " << s <<endl;
    vector<string>::iterator vit = actorset.begin();
    vector<string>::iterator ven = actorset.end();
    cout << "Correct Answers are: "<<endl;
    for ( ; vit != ven; vit++) 
      if (s.compare(*vit) == 0) 
        correct = 1;
      
      cout << *vit <<'\t'; 
    
    cout <<'\n';
    if (correct == 0) 
    chance --;
    cout << "Incorrect answer" << endl;
    cout << "Your total score is " << score <<"."<<endl;
     else 
    score += 10;
    level++;
    cout <<"Correct answer! You get 10 points!"<<endl; 
    cout << "Your total score is " << score <<"."<<endl;
    
  

cout <<"high score handler"<<endl;
output.open (outfile_name, std::fstream::in | std::fstream::out);
highscore(output,score);
cout << "type y for another try: ";
cin >> again;

【问题讨论】:

【参考方案1】:

罪魁祸首几乎可以肯定是你cin &gt;&gt; again;

至少在大多数系统上,您需要按 yEnter 之类的键将y 输入到程序中。

这使得 enter 仍在输入缓冲区中等待。在循环的下一次迭代中,std::getline 查看输入缓冲区,看到 enter,并将其作为空行读取。由于它看到了一个已输入的“行”,它不会等待更多 - 它只是读取该空行,并将其返回给您的程序进行处理。

避免这种情况的常用方法是避免混合面向字符的输入和面向行的输入。如果不能完全避免,则通常需要添加代码以忽略面向字符的输入和面向行的输入之间的输入行的其余部分。

【讨论】:

以上是关于使用 getline(cin, string) 时,cin 自动取值,无需询问的主要内容,如果未能解决你的问题,请参考以下文章

关于 getline(cin, string) 的 C++ 快速问题

getline(cin,_string);

在 getline 之后在 C++ 中输入

getline(cin, string_name) 之前需要 cin.get()

Cin 和 getline 不会正确保存非 ascii 字符

使用 `cin >> n;` 后使用 `getline(cin, s);`