C++书上例题运行出现问题

我是用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

        之所以采纳下面那位大大的回答,不是说完全解决了问题,而是给了思路,非常感谢所有回答的热心的人。

4个回答

这是编译器的问题,通常你在linux下运行时没问题的,但是在VS下会出现一些“意想不到”的问题,多半是缓冲区的问题,你在cin之前将缓冲区清空,
cin >> num; 之后再次清空下缓冲区,就可以解决问题。
cin.clear();
cin >> num;
cin.clear();
cin >> score;

g++编译 直接运行 不能复现这个问题
图片说明

程序是没有错的,都是按顺序往下的,怎么会跳过;
你提出的这三个都不是错误。至于会出现你运行的这种现象,我估计应该是编译器的事儿。

但是我从来没出现过你的这种情况啊。

你可以使用system("pause"),来使得界面暂停,这样很方便。也不需要你写很多的cin.get();语句
还有,这里输入的并不是字符,不会存在回车和空格在下次直接输入,从而跳过用户的输入。
我亲自在VS2015测试了一下,没有什么问题,你重新建立一个项目试一下。
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐