for循环跳过getline

时间:2012-02-01 15:35:30

标签: c++ loops for-loop struct

大家好,我正在对结构化数据进行编程工作,我相信我理解结构是如何工作的。

我正在尝试阅读学生姓名,身份证号码(A-Numbers)及其余额列表。

当我编译我的代码时,它会在第一次读取所有内容,但第二次绕循环,每次之后,它会提示输入用户名但跳过getline并直接转到A-Number和A - 数字输入。

任何帮助将不胜感激。只是试图找出每次循环时如何使getline工作。

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;


int main(){
    const int maxStudents = 30;
    struct Students{
        string studentName;
        int aNumber;
        double outstandingBalance;};

    Students students[maxStudents];

    for(int count = 0; count < maxStudents-1; count++)
    {
        cout<<"Student Name:";
                cin.ignore();
        getline(cin,students[count].studentName);
        cout<<"\nA-Number:";
        cin>>students[count].aNumber;
        if(students[count].aNumber == -999)
            break;
        cout<<"\nOutstanding Balance:";
        cin>>students[count].outstandingBalance;
    }

    cout<<setw(20)<<"A-Number"<<"Name"<<"Balance";

    for(int count2 = 29; count2 >= maxStudents-1; count2--)
        cout<<setw(20)<<students[count2].aNumber<<students[count2].studentName<<students[count2].outstandingBalance;


    system("pause");
    return 0;
}

4 个答案:

答案 0 :(得分:3)

查找C++ FAQ on iostreams

项目15.6专门处理您的问题(“为什么我的程序在第一次迭代后忽略了我的输入请求?”),但您可能会发现整个页面都很有用。

HTH,

答案 1 :(得分:3)

你正在做的事情不起作用的原因是'&gt;&gt;'经营者 第一次不提取尾随'\n',下一个getline 看到它,并立即返回一个空行。

简单的答案是:不要混用getline>>。如果输入是 面向行,使用getline。如果需要解析行中的数据 使用>>,使用getline读取的字符串初始化a std::istringstream,并在其上使用>>

答案 2 :(得分:1)

cin.ignore();

在循环结束时。

答案 3 :(得分:0)

问题在于混合cingetline。格式化输入(使用&gt;&gt;运算符)和无格式输入(getline是一个示例)不能很好地一起使用。你一定要仔细阅读它。 Click here for more explanation

以下是您的问题的解决方案。 cin.ignore(1024, '\n');是关键。

for(int count = 0; count < maxStudents-1; count++)
{
    ...
    cout<<"\nOutstanding Balance:";
    cin>>students[count].outstandingBalance;
    cin.ignore(1024, '\n');
}