【问题标题】:How get cin to stop skipping? [duplicate]如何让cin停止跳过? [复制]
【发布时间】:2014-06-20 00:42:22
【问题描述】:

对不起,我不知道如何更好地问这个问题,我是一个真正的新手程序员,我并不是在找你做我的作业,但我想了解为什么这种情况一直发生。

int inputScores(string names [], double scores [])
{
  int count = 0;  // counter variable for number of student records in array
  char again;     // To check if user has more data
  do
  {
    cout << "Enter student's name: ";
    getline(cin, names[count]);
    cout << "\nEnter student's score: ";
    cin >> scores[count];
    count++;
    cout << "\nDo you have more student records to enter?(Y/N): ";
    cin >> again;

  }while(again == 'y' || again == 'Y');

当我运行此代码并调用函数时,这种情况不断发生,我不知道如何修复它:

输入学生姓名:Arthur

输入学生的分数:100

你有更多的学生记录要输入吗?(Y/N):y
输入学生姓名:
输入学生的分数:

它跳过“输入学生姓名问题”(不让我输入任何内容)并直接进入下一个问题。

【问题讨论】:

  • 为什么不是namesscores 局部变量?将它们作为副本传递是违背目的的。
  • cin 只读取 y,让下一个 getline 读取换行符。这个问题很常见,所以请尝试查看“相关”列的解决方案,并记住在发布之前对 SO 进行良好搜索
  • @tadman 我不太清楚你的意思,这只是老师让我们做作业的方式,将这些数组传递给这个函数,该函数应该用用户的输入填充数组。
  • @user3125280 在发布此之前我搜索了很多,我还没有上过这个网站但是现在我正在查看其他帖子,我想我只需要阅读更多关于键盘缓冲区和 cin .谢谢!

标签: c++ cout do-while cin


【解决方案1】:

程序不等你输入学生姓名的原因是在你读到again之后,输入流中还剩下一个\n

cin >> again;

程序到达时:

getline(cin, names[count]);

它只是读取一个空行并移动到下一行。

你需要使用:

int maxCharsToIgnore = 100; // This seems large enough
                            // for your use case.
cin.ignore(maxCharsToIgnore,'\n');

紧接着

cin >> again;

【讨论】:

  • 这行得通,但是我必须在第一次输入名称后按两次回车键。你知道为什么吗?
  • @user3758431,您可以在阅读again后立即移动cin.ignore行。
  • @WhozCraig,感谢您的支持。我同意你使用std::numeric_limits&lt;std::streamsize&gt;::max()
  • @WhozCraig 非常感谢,我确实需要阅读更多内容,就像我说的我是新手,这是我的第一堂编程课,老师从未提到过有关 cin.ignore() 的任何内容。你建议阅读这个主题吗?一旦我有更多的代表,我也会回到这里为你投票。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 2011-02-04
  • 1970-01-01
  • 2011-05-03
  • 2016-02-05
  • 2015-05-23
相关资源
最近更新 更多