标签:
讨论一下C语言中的字符串。
字符串是一种重要的数据类型,但是C语言并没有显式的字符串数据类型,因为字符串以字符串常量的形式出现或者存储于字符数组中。
字符串是一串零个或多个字符,并且以一位模式为全0的 NUL 字节结尾。
示例:
1 char szStr0[] = "Oogway"; /// 将一个 字符串 赋值给一个数组 2 char szStr1[7] = "Oogway"; 3 char szStr2[10] = "Oogway"; 4 char szStr3[6] = "Oogway"; ///// 不合法的赋值操作,因为"Oogway"占7个字节空间,而字符数组szStr3只分配了6个字符空间。 5 char szStr4[7] = { ‘O‘, ‘o‘, ‘g‘, ‘w‘, ‘a‘, ‘y‘, ‘\0‘ }; 6 char szStr5[6] = { ‘O‘, ‘o‘, ‘g‘, ‘w‘, ‘a‘, ‘y‘ }; /////只是一个字符数组,不是一个字符串。因为它没有字符结束标志。
以szStr2 为例来说明
sizeof(szStr2) 结果为 10;
strlen(szStr2) 结果为 6;
szStr2中"Oogway"字符串占用了 7 个字节的空间;
1.一个长度为N个字节的字符串赋给数组的时候,需要为它准备N+1个字节的内存空间;
2.字符串存储于数组中时,必须以 ‘\0‘结尾(‘\0‘ 就是 将那一位 赋值为 0)。为什么要重点强调这点,是因为 实际工作中,经常遇到 没有以‘\0‘结尾的情况,导致得到的字符数组越界。这种bug出现的频率还是蛮高的。(为什么会有没有以‘\0‘结尾的情况?这种问题,大多出现在 memcpy或者 sprintf , strcpy 的时候,后面的关于“字符串”的文章会讨论这几个函数)
3.strlen计算数组长度的时候,没有计算 末尾的 ‘\0‘ 字符;例如,szStr2的 字符串长度是 6
4.字符串所占用的内存空间是 字符串长度+1 ,例如 "Oogway"字符串长度是6,但必须给它分配 7 个字节的空间,才能装的下这个字符串。szStr2拥有10个字节的内存空间,能装得下这个字符数组。
标签:
原文地址:http://www.cnblogs.com/MasterOogway/p/5778554.html