cin.getline进入无限循环

时间:2015-11-20 14:24:52

标签: c++ std

我正在尝试使用cin.getline()函数获取带空格的字符串,但是当我这样做时,我的程序无休止地循环。

我添加了'\n',但它不起作用。

我真的不知道我做错了什么。有人可以帮忙吗?

#include <iostream>
using namespace std;

#include "HealthClub.h"

void main()
{
    int i, ans=0;
    char tname[20] = { 0 }, dname[20] = { 0 };
    HealthClub newhc;
    cout << "please enter the new trainer`s name:" << endl;
    cin.getline(tname, 20, '\n');
    newhc.addTrainer(tname);
}

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

你有两个问题。

第一个已由cdonat描述。想一想当你输入1时会发生什么。

  1. ans是1。
  2. 执行case 1部分。
  3. 检查while条件。
  4. 循环再次执行,因为ans是1
  5. 也许这甚至是期望的行为 - 我不知道。

    你的第二个问题是getlinegetline不会从输入流中删除换行符。 当您致电cin >> ans;时,剩余的换行符将用作触发器。

    根据使用的C ++版本,cin>>不会更改输入无效时写入的值。

    由于您的输入流是单个换行符,因此不断将空字符串传递给ans。因此ans永远不会改变1

    同样的行为也会导致getline直接返回空字符串。

    在调用getline以删除/忽略剩余数据后,您需要清除输入流。 在cin.ignore();之后添加对此cin.getline()的电话

    cin.getline(tname, 20, '\n');
    cin.ignore();
    

答案 1 :(得分:-1)

while (ans != 7)
{
    cin >> ans;
    switch (ans)
    {
        case 1:
        {
            cout << "please enter the new trainer`s name:" << endl;
            cin.getline(tname, 20, '\n');
            newhc.addTrainer(tname);
        }
        break;
    // ...

在这种情况下,您永远不会更改ansans之后仍然是1,while循环刚刚重新开始并再次进入第一个语句。

它与getline()没有任何关系。