由scanf引发的思考
2009-06-18 14:57
423 查看
#include <stdio.h>
main()
{
int n=5;
char c[5];
for(int i=0; i <n; i++){
scanf("%c",&c[i]);
fflush(stdin);}
printf(c);//为什么输出会多出奇怪的字符
return 0;
}
这是我最初的问题代码,是啊,为什么要输出一些奇怪的字符呢?因为我的数组没有结束字符'/0',就是这个原因!
对于字符串我们平常是这样用的c[5]={"iwai"};或者是c[5]="iwai";其中已将包含'/0'赋给了c[5],以前虽然知道,但是没注意
现在对比这个问题就很有代表性了,所以导致了上面输出的错误情况!
所以上述要将a[4]赋值'/0'才是正确的!
哎,搞的中午午觉都没怎么睡,收工睡觉!
至于为什么就算我没有结尾符号它也只是输出有限的无用数据,也没有因为没有结尾二结不了尾,这个是因为什呢机制呢?目前还不清楚,希望网友的帮助!
输出就是asdfg烫?
为什么计算机输出“烫”,而且我发现我电脑了很多区域都是“烫”
其实是这样的
内存里面会有存放'/0'的地方,打印的时,什么时候遇到内存中有'/0',就在那里结束,所以后面的字符长度是随机的
未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字
哎,搞的中午午觉都没怎么睡,收工睡觉!
main()
{
int n=5;
char c[5];
for(int i=0; i <n; i++){
scanf("%c",&c[i]);
fflush(stdin);}
printf(c);//为什么输出会多出奇怪的字符
return 0;
}
这是我最初的问题代码,是啊,为什么要输出一些奇怪的字符呢?因为我的数组没有结束字符'/0',就是这个原因!
对于字符串我们平常是这样用的c[5]={"iwai"};或者是c[5]="iwai";其中已将包含'/0'赋给了c[5],以前虽然知道,但是没注意
现在对比这个问题就很有代表性了,所以导致了上面输出的错误情况!
所以上述要将a[4]赋值'/0'才是正确的!
哎,搞的中午午觉都没怎么睡,收工睡觉!
至于为什么就算我没有结尾符号它也只是输出有限的无用数据,也没有因为没有结尾二结不了尾,这个是因为什呢机制呢?目前还不清楚,希望网友的帮助!
输出就是asdfg烫?
为什么计算机输出“烫”,而且我发现我电脑了很多区域都是“烫”
其实是这样的
内存里面会有存放'/0'的地方,打印的时,什么时候遇到内存中有'/0',就在那里结束,所以后面的字符长度是随机的
未初始化的变量会被系统赋初值为0xCC,超过了ASCII码0-127这个范围,因此这个“字符串”被系统当成了宽字符组成的字符串,即两个字节数据组成一个字符,而0xCCCC表示的宽字符正好是乱码中的那个“烫”字
哎,搞的中午午觉都没怎么睡,收工睡觉!
相关文章推荐
- 由scanf() 和 fgets() 引发的思考
- 由使用Scanf()函数导致程序逻辑错误引发的思考
- 二叉树算法引发的思考:指针参数传递、引用的陷阱
- C语言scanf容易引发的bug
- 一个java面试题引发的思考
- 一道面试题引发的对数据类型转换的思考
- 一道CTF题引发的思考-MySQL的几个特性
- 由Semaphore引发的思考----SpinLock Mutex Condition variable
- 由判断三一点是否在三角形内部而引发的思考.....
- 由AlphaGO引发的思考
- 关于C语言除0引发的思考
- 零碎与恒心引发的思考
- foreach 引发的值类型与引用类型思考
- 由简单小问题引发的思考和推理
- 由Android 65K方法数限制引发的思考
- 存储过程引发的思考
- 再议Java/Android回调——由一段Bmob查询操作引发的思考
- 由传值引发的思考
- 一场由Java堆污染(Heap Pollution)引发的思考
- IDC 双线技术引发的思考