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的状态一节。
用户评论