字符串
概念说明
C 语言里的字符串本质上是以空字符 \0 结尾的字符数组。
也就是说,字符串并不是一个独立的内建类型,而是一种约定好的内存布局。
理解这一点后,很多常见问题就更容易解释:
- 为什么字符串需要为结尾的
\0预留空间。 - 为什么比较字符串不能直接用
==。 - 为什么拷贝字符串时容易越界。
还要分清两个常见写法:
char name[] = "Tom";:可修改的字符数组副本。const char *name = "Tom";:指向字符串字面量的指针,通常不应修改内容。
语法/规则
- 字符串字面量例如
"hello",底层会包含结尾的\0。 - 常见字符串函数位于
<string.h>,例如strlen、strcmp、strcpy、strcat、strchr。 - 用字符数组保存可修改字符串时,要给
\0预留空间。 - 比较字符串内容应使用
strcmp,而不是直接使用==。 strlen统计的是\0之前的字符个数,不包含终止符本身。- 读取整行文本时,通常
fgets比scanf("%s", ...)更稳妥。 - 对于拼接和格式化构造字符串,
snprintf往往比无长度控制的接口更安全。
示例
| |
输出结果:
| |
常见错误
- 忘记为字符串结尾的
\0预留空间,导致越界写入。 - 用
==比较两个字符串内容,而不是使用strcmp。 - 把字符串字面量当成可写数组去修改,结果触发未定义行为。
- 使用
strcpy、strcat这类函数时没有确认目标缓冲区是否足够大。 - 混淆“字符数组”和“指向字符串的指针”,导致修改权限和生命周期判断出错。