做了一个简单的学生成绩统计的小程序,储存学生信息并输出最高与最低成绩,
但是输入时候总是自动跳过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;
}