这几天一直再看《C primer plus》,然后写一些书上习题的小程序。在调试的过程中遇到一些问题。
详见图片。
大家注意,在调试过程中,遇到了一个警告提示。
Run-time Check Failure #2 - Stack around the variable 'ch_ascll' was corrupted
根据我超烂的英语知识+金山词霸的单词翻译和我的主观臆测,得到的结论是这段话的意思是说:在运行时检查变量数据在堆栈存储的范围发生异常。
我们现来看看代码:
// 3.11-2解答.cpp : 定义控制台应用程序的入口点。
//题目:要求输入一个ASCII码值,输出相应的字符 buy Bugsong
//作者blog:blog.csdn.net/bugsonglinux
#include "stdafx.h"
#include "stdio.h"
int _tmain(int argc, _TCHAR* argv[])
{
char ch_ascii;
ch_ascll = 0;
printf("请输入一个ASCLL数值:/n");
scanf("%u",&ch_ascll);
printf("对应的字符是:%c",ch_ascll);
return 0;
}
在这段小代码中定义的变量为char,但是在输入函数scanf中输入的数据类型说明符为%u(无符号十进制数)。
我想出现问题是在输入的是十进制数,但是变量的类型为char字符型,在内存空间的分配上出现了问题。还有就是ch_ascll变量在没有赋值进行初始化的时候还有一个警告,这个我忘记截图了。因为在程序的运行过程中变量会被随意赋值。
再来看张截图:
这个也是变量的类型问题,但是我不理解的是年龄是一个很小跨度的单位,小于200,对吧?这样用short int是很好的,但是用这个数据类型就是不行,可能是机器字长的问题吧,编译环境和硬件环境让short int和int都是32位的数据。所以会有相应的警告吧。
修改后的代码:
// 3.11-2解答.cpp : 定义控制台应用程序的入口点。
//题目:要求输入一个ASCII码值,输出相应的字符 buy Bugsong
//作者blog:blog.csdn.net/bugsonglinux
#include "stdafx.h"
#include "stdio.h"
int _tmain(int argc, _TCHAR* argv[])
{
int ch_ascii;
ch_ascll = 0;
printf("请输入一个ASCII数值:/n");
scanf("%u",&ch_ascii);
printf("对应的字符是:%c",ch_ascii);
return 0;
}
// 3.11-5解答.cpp : 定义控制台应用程序的入口点。
//题目:一年约有3.156*10^7s,输入年龄。换算成秒数
//作者blog:blog.csdn.net/bugsonglinux
//输入为short int 整形 输出为double浮点型数据
#include "stdafx.h"
#include "stdio.h"
#define TIME 31560000 //常量定义
int _tmain(int argc, _TCHAR* argv[])
{
int i_age;
double d_agetime;
i_age = d_agetime = 0; //初始化变量
printf("请输入您的年龄:");
scanf("%u",&i_age);
d_agetime = i_age * TIME;
printf("您的年龄转换为秒为:%f",d_agetime);
return 0;
}
以上就是我的一点思考,有不对的地方欢迎大家拍砖!!两段代码在win7+vs2008以及winxp sp3+vs2008中编译通过。