4.5 字符串

本篇学习 C 字符串的底层表示、字符数组与字符串指针差异,以及常见字符串函数和安全处理要点。

字符串

概念说明

C 语言里的字符串本质上是以空字符 \0 结尾的字符数组。 也就是说,字符串并不是一个独立的内建类型,而是一种约定好的内存布局。

理解这一点后,很多常见问题就更容易解释:

  • 为什么字符串需要为结尾的 \0 预留空间。
  • 为什么比较字符串不能直接用 ==
  • 为什么拷贝字符串时容易越界。

还要分清两个常见写法:

  • char name[] = "Tom";:可修改的字符数组副本。
  • const char *name = "Tom";:指向字符串字面量的指针,通常不应修改内容。

语法/规则

  1. 字符串字面量例如 "hello",底层会包含结尾的 \0
  2. 常见字符串函数位于 <string.h>,例如 strlenstrcmpstrcpystrcatstrchr
  3. 用字符数组保存可修改字符串时,要给 \0 预留空间。
  4. 比较字符串内容应使用 strcmp,而不是直接使用 ==
  5. strlen 统计的是 \0 之前的字符个数,不包含终止符本身。
  6. 读取整行文本时,通常 fgetsscanf("%s", ...) 更稳妥。
  7. 对于拼接和格式化构造字符串,snprintf 往往比无长度控制的接口更安全。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>
#include <string.h>

int main(void) {
    char name[20] = "C language";
    char copy[20];

    snprintf(copy, sizeof(copy), "%s", name);

    printf("text = %s\n", copy);
    printf("length = %zu\n", strlen(copy));
    printf("same = %d\n", strcmp(name, copy) == 0);
    return 0;
}

输出结果:

1
2
3
text = C language
length = 10
same = 1

常见错误

  1. 忘记为字符串结尾的 \0 预留空间,导致越界写入。
  2. == 比较两个字符串内容,而不是使用 strcmp
  3. 把字符串字面量当成可写数组去修改,结果触发未定义行为。
  4. 使用 strcpystrcat 这类函数时没有确认目标缓冲区是否足够大。
  5. 混淆“字符数组”和“指向字符串的指针”,导致修改权限和生命周期判断出错。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字