今天热门
热点:

VS2010 C++数据溢出的问题,vs2010溢出


我正在用VS2010中文版学习C++,教材是Steve Oualline的《实用C++程序设计》中文版,有一点C的基础。我利用VS2010建立了一个空项目,然后开始编写书中的例题和练习,当我做到练习6-1时,遇到了问题。这个题目是个打分的程序,根据考试0~100的分数给出相对应的等级 ,如:0~60分,等级F,61~70,等级D ,71~80,等级C,81~90,等级B,91~100,等级A,我写了如下程序:

/************************************************************
*名称: name----                                                                               *
*作者:azhou                                                                                     *
*目的:测试分数转换为字母等级                                                             *
*用法:运行程序并显示消息                                                                   *
*      在Windows下,DOS窗口会被关闭,所以在程序结尾用了                     *
*      一个while(true);死循环而不是returned(0),以                         *
*      保持DOS窗口不会被自动关闭                                                         *
************************************************************/
#include<iostream>
char numbers; //分数
unsigned char grade; //等级
int main()
{  
 std::cout<<"请输入分数):";
 std::cin>>numbers;
 while(numbers<0||numbers>100)   //若数据输入范围出错,提示重新输入数据
 {
  std::cout<<"输入分数错误,请重新输入分数(0~100)";
  std::cin>>numbers;
 }

 //根据分数判断出等级
 if(numbers<60)grade='F';
 else if(numbers<=70)grade='D';
 else if(numbers<=80)grade='C';
 else if(numbers<=90)grade='B';
 else  grade='A';
    std::cout<<"分数是:"<<numbers<<" 等级为:"<<grade<<"\n"; 
 while(true);
}

因为我想分数都是0~100,所以char类型-128~127的取值范围足够了,但当运行后出现这样的结果:

请输入分数:50

分数是:5 ,等级是:F

即numbers只能得到数值的第一个数字。为什么?这是第一个问题。

当我把分数定义改为:int numbers后,程序正常了,可以正常的显示了。但我在调试的时候无意之间输入了一个非常大的数据:11111111111(11个1),然后问题产生了,程序开始无休止的输出:“输入分数错误,请重新输入分数(0~100)”,陷入了死循环。我测试过,当数据位数小于10时,程序都是正常的,但数据位数为11位的时候出现了问题。这是第二个问题。我想这可能是Windows的数据溢出了,有人能够详细的分析一下原因然后给出一个合理的解决方案吗?谢谢。


解决方案

 std::cout<<"请输入分数):";
 std::cin>>numbers;
 if (std::cin.fail())
 {
  std::cin.clear();
 }
 while(numbers<0||numbers>100)   //若数据输入范围出错,提示重新输入数据
 {
  std::cout<<"输入分数错误,请重新输入分数(0~100)" ;
  std::cin>>numbers;
  if (std::cin.fail())
  {
   std::cin.clear();
  }
 }

问题已经解决

这主要是Streams状态的问题。Streams定义了一些型别为iostate的常数,用以反映stream的状态:     goodbit :一切都好;没有其他任何状态为被设立;     eofbit  :遇到end-of-file;     failbit :错误;某个I/O操作未成功(通常是由于读入格式错误,例如程序想读入一个整数,却遇到一个字符);     badbit  :毁灭性错误;   C语言可以在“格式错误”发生之后仍然读入字符。但C++不同:如果设置了failbit,除非显示予以清除,否则无法进行下一个操作。   具体请参考《C++标准程序库》p597, Streams的状态一节。

www.zrccd.nettrue/topics/20180113/67863.htmlTechArticleVS2010 C++数据溢出的问题,vs2010溢出 我正在用VS2010中文版学习C,教材是Steve Oualline的《实用C程序设计》中文版,有一点C的基础。我利用VS2010建立了一个空项目,然后开始编写书中的例题...

相关文章

    暂无相关文章

用户评论

大家都在看