Bug
char型的可以打印到遇到字符结束符为止[如图res1_char array.jpg];
int型数组名为起址的字符串仅能打印出4个字节,也就是第一个元素[如图res2_int array.jpg]。
对比:
----------char
-------------int
在对数组名称的作用的测试中,发现int型数组名的不解:
int型数组名为起址的字符串仅能打印出4个字节,也就是第一个元素;而char型的可以打印到遇到字符结束符为止。
字符串不过因为每个元素占一个字节,我把每个元素占4个字节,咋滴就out了?
ps:
1.函数原型,如图prototype.jpg;
2.ide,如图compiler.jpg。devC++ 4.9.9.2.
DEbug:
a、C里面printf的格式化中%s表示的
是“从0xXX地址开始的,到 EOF 或EndOfLine结束的字符串”?
-----此处确实是这样。实际上遇到的EOF通常的ASCII码值就是‘\0’的值[经查
是“0”]。
b、推测: 这里的4个字节,在打印出低位第一个字节后,就遇到了ASCII码值为“0”的,被当成EOF,
故end;紧接着‘7’这个字符所在的高一个字节 被赋值“0”,how?
1.赋值时不小心被默认赋值;2.其他未知方式。
c、在google的时候,偶然间发现症结。有这样的强制类型转换:int i = (int) 'a ';(转换可隐式)
i获得的正是‘a’的ASCII码值。俺就是这样赋值给int数组的,故‘7’以外的高字节被默认赋值0,就相当于EOF
d、经过对比,用字符串copy的库函数赋值就不存在楼主的问题
本着以据为实的态度,这里要把‘7’附近的高低几个字节赋值为非0,看看结果是不是恰恰反过来。
1.赋值:需注意大小系统的大小终端;2.何值:除‘7’所在的其他字节,某一位非0即可。见图。
这里的Endian由问题本身就可知了:1.打印是从低地址字节开始的;2.无聊int还是char,‘7’这个字节
都打印出来了,该字节为低地址;即低字节在低地址,小终端(升序)。 最好了解下,不然不小心
把相邻字节的赋了值,会影响的
Solution:
方法:需把int型指针强制转换成char型,逐字节赋。见下。
函数:
or
试试打印,详见下图。
---给邻位赋值“1”---
---给邻位赋值“7”---
Conclusion:
bug成因
1.初始化导致
隐式 类型提升;
2.由1导致过早得到EOF。
这里涉及的问题似乎不少:
1.初始化的有效性;2.隐式 类型提升;3.大小终端;4.字符和其ASCII码值的转换;5.格式化输入输出。
及时到google搜索,偶然得解。这样也可以复习,印象比较深刻。