黑马程序员技术交流社区

标题: 关于C语言中的字符串问题 [打印本页]

作者: 黑白世界    时间: 2015-9-22 10:31
标题: 关于C语言中的字符串问题
我们知道C语言的字符串很变态,是一个字符数组,而且字符串的最后默认以‘\0’结尾,如果我们不以'\0'结尾会怎样呢?我们看一看:
  1. char s1[3]="abc";
  2. char s2[3]="def";
  3. printf("%s",s1);
  4. printf("%s",s2);
复制代码

在以上代码中,字符串s1和s2都定义为3个长度,但是赋值的字符串都是3个长度,这样做的结果就是s1和s2都被赋值的字符串沾满了,都没有以'\0'结尾。
那输出结果呢?
printf("%s",s1);  输出: abc
printf("%s",s2);  输出:defabc

我们现在通过内存分析来解释一下这个问题,如下为这两个字符串的内存分析(渣渣图示请自行脑补):
    s2  [0]  |___d___|
    s2  [1]  |___e___|
    s2  [2]  |___f____|
    s1  [0]  |___a___|
    s1  [1]  |___b___|
    s1  [2]  |___c___|
当用%s占位符输出时,会把传入的变量当做字符串处理(可以传入一个char变量实验一下)。输出时会一直读取到第一个'\0'出现才会停止,当输出
s1时,s1是先定义的变量,先定义的地址大,所以在后边,读取abc之后没有再可以输出的了,则输出了abc。
当输出s2时,先读取了def,但是没有读取到'\0'结尾标志,所以继续读取了s1的内存。

由上可知,当定义一个字符串变量时,正确的定义是多么重要,如果出现了以上的情况,在大型的程序中,最后输出一个什么玩意就没有现在这么简单了。
最后,再说一句字符串长度的函数,strlen()。这个函数的原理也是从字符串的第一个字符开始,直到读取到第一个'\0'结束。所以和printf()输出字符串是一个道理啦 。



作者: hejianchun    时间: 2015-9-22 10:37
之前的C语言感觉难,学了OC之后我就觉得C语言的挺简单..OC算是给我难住了这考试我就忐忑了
作者: acdd112    时间: 2015-9-22 11:27
虽然strlen()是读取到"\0",但它返回的长度不包含"\0"
作者: acdd112    时间: 2015-9-22 11:36
从楼主的意思上是想根据字符串长度来动态定义数组,但是c99之前数组是不能动态定义的,数组大小必须是一个常量,一个在堆上的动态数组只能使用指针来定义
列如 一个用于存储N个整数的数组 可以这样写
int *parray = (int*) malloc(N*sizeof(int))
作者: chunhuayun    时间: 2015-9-22 11:54
感觉c还是挺有意思的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2