牛骨文教育服务平台(让学习变的简单)
博文笔记

漫步IOS--二维数组定义原则、strlen()初探、

创建时间:2014-12-29 投稿人: 浏览次数:1050

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。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。