漫步IOS--二维数组定义原则、strlen()初探、
1二维数组定义原则
二维数组的定义:可以不给定行数,但必须给定列数。编译器会根据给出的列数和初始化元素的个数确定有几行。
2 strlen()初探
strlen()是求一个字符串的长度。在解决问题的时候发现了一个挺好玩的事情。是这样的,对于下面的代码,你觉得他会输出啥呢?
int main(int argc, const char * argv[]) { char a[][9] = {"天下会","风云","雄霸"}; long max = 0; for (int i = 0; i < 3; i++) { if (max < strlen(a[i]) ){ max = strlen(a[i]); } } printf("%ld",max); }这里我得声明一下,对于汉字略微有些特别,在不同的编码中一个汉字占的字节数是不一样的。windows下的工程默认的是UTF-8,一个汉字占两个字节。mac下默认的字符编码是unicode,一个汉字占3个字节。基于以上,我天真的以为会输出的是9,结果编辑器狠狠地打了我的脸,输出的是15.
于是我就开始考虑为什么会蹦出个15,想想switch的break,再想想数组的内存中的存储,然后我就把代码做了一下小改动。
int main(int argc, const char * argv[]) { char a[][9] = {"天下会","风云二","雄霸"}; long max = 0; for (int i = 0; i < 3; i++) { if (max < strlen(a[i]) ){ max = strlen(a[i]); } } printf("%ld",max); }果然,最后输出的是24.为什么呢?
我个人猜测问题在a[][9]上。strlen的实现应该是以字符串开始后遇到的第一个‘ ’作为结束条件的。但是刚好“天下会”三个字要占9个字节,而数组第一行的空间刚好也是九个字节,没有空间去存放‘ ’了。而二维数组其实在内存中是采用一维的方式存储的,所以,“天下会”后面紧接着的就是“风云”,没有空间去在中间放" ",然后这个第二行是有空余空间去存放‘ ’的,所以strlen结束返回。返回值就是“天下会风云”(5)*3=15,然后为了验证一下,我在“风云”后面又加了一个字,这样第二行也没有空余空间存放‘ ’了,那么按理说,strlen()应该返回的是三行的汉字数之和再乘以3,也就是8*3=24.于是就会出现第二段代码的结果,虽然我只是求数组的第一行的字符串的长度,但是结果却显示的是三行汉字的长度,即24。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: yii2.0缓存篇之片段缓存
- 下一篇: iOS入门(六)二维数组