有关c++中getline的问题

做了一个简单的学生成绩统计的小程序,储存学生信息并输出最高与最低成绩,
但是输入时候总是自动跳过cin,这是为什么
#include
#include
using namespace std;
struct node
{
string name;
int id;
int grade;
}a[10];
int main()
{
int n;
cin>>n;
for(int i=0;i {
getline(cin,a[i].name);
cin>>a[i].id;
cin>>a[i].grade;
}
int max=0;
int min=0;
for(int i=1;i {
if(a[max].grade if(a[min].grade>a[i].grade) min=i;
}
cout<<a[max].name<<" "<<a[max].grade<<endl;
cout<<a[min].name<<" "<<a[min].grade;
}

int main()
{
int n;
cin >> n;
string temp;
for (int i = 0; i {
cin.ignore();;//忽略回车
getline(cin, a[i].name);
cin >> a[i].id;
cin >> a[i].grade;
}

}

终其原因就是因为getline函数把上次出入n之后的空格当做输入了,2楼3楼方法都可以

getline(cin,String)这个规定第二个参数就一定要是String类型,如果要用char数组,改成
cin.getline(字符指针(char*),字符个数N(int),结束符(char));
此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为'\n'。

加上一行getline忽视掉回车键就好了:

 int main()
{
    int n;
    cin >> n;
    string temp;
    for (int i = 0; i<n;i++)
    {
        getline(cin, temp);//忽略回车
        getline(cin, a[i].name);
        cin >> a[i].id;
        cin >> a[i].grade;
    }

}

cin.ignore();

打错字了,是把输入n之后的回车符当做输入行了

    int n;
    cin>>n;
    for(int i=0;i {
        getchar();
        getline(cin,a[i].name);
        cin>>a[i].id;
        cin>>a[i].grade;
    }

其实很多针对char*的库函数是不支持string参数的,
不过getline的输入流恰好以cin的新标准运作,,
缓存区读入整形类型后如果单独成行,就会遗留\n霸占当前行
另外getline和非字符串类型交互输入都是搭配getchar()等使用的

直接用cin是不是会好一点???比较方便。不会出错。可以输入一行(自行解析),也可以输入多行。

  int n;
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>a[i].name;
        cin>>a[i].id;
        cin>>a[i].grade;
    }
    还有就是可以直接写成
    int n;
    cin>>n;
    for(int i=0;i<n;i++) {
        cin>>a[i].name>>a[i].id>>a[i].grade;
    }