fj9666
2017-07-06 10:02
采纳率: 100%
浏览 821

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条回答 默认 最新

  • 温良岁月 2017-07-07 09:43
    最佳回答

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

    评论
    解决 无用
    打赏 举报
查看更多回答(3条)

相关推荐 更多相似问题