我是用vs2013调试运行的
#include <iostream>
using namespace std;
class Student
{
private:
int num;
int score;
public:
void setdata()
{
cin >> num;
cin >> score;
}
void display()
{
cout << "num : " << num << endl;
cout << "score = " << score << endl;
}
};
Student stud1, stud2;
int main()
{
stud1.setdata();
stud2.setdata(); //老是运行到这里就自动跳过了
stud1.display();
stud2.display(); //这两条语句能正常输出,第一个输出正常,第二个输出都是0
cin.get();
cin.get(); //两个cin.get()在程序中也不起作用了
return 0;
}
初学C++请教各位大神,注释中的问题是怎么回事,怎么解决。
2017-7-12
找了几天问题,终于弄懂了,当时我输入数据时,给"score"输入的是98.5,是个浮点数,而"score"是int型,由此产生了“意想不到”的结果。
后又发现,不管是用cin语句输入,还是用scanf_s语句输入,都是同样的运行结果,会莫名其妙跳过。
随后把后面修改成了
printf_s("%d\n", cin.get());
printf_s("%d\n", cin.get());
printf_s("%d\n", cin.get());
cin.get();
可以看到最后的三个cin.get()接收了几个莫名的东西。
后来查资料又看到“当cin尝试将输入的double型数字读为int型数据失败后,会产生一个错误状态--cin.fail().而要用cin读取输入流中的数据,输入流必须处于无错误状态。”推测是在我输入浮点数给int型变量后,cin或者scanf_s使缓冲区出了些问题。
由此,我改动了下setdata()函数:
void setdata()
{
cin.clear(); //想用它清空缓冲区
cin >>num;
cin >>score;
}
运行后发现并不能解决跳过问题。
查资料,又改了下:
void setdata()
{
cin.clear();
cin.sync(); //不理解为什么一定要加这个
scanf_s("%d", &num);
scanf_s("%d", &score);
}
这样修改后,才没有跳过,保证了正常的输入。
其实很简单,输入的数据类型不符导致的错误,输对就好了,以上都是钻牛角尖TT
之所以采纳下面那位大大的回答,不是说完全解决了问题,而是给了思路,非常感谢所有回答的热心的人。