字符串
C语言中的字符串操作和现代语言(如 Python、Java)完全不同。在 C 语言中,没有专门的 string 类型,字符串本质上是 字符数组。
理解 C 语言字符串的核心在于理解 \0 (空字符)。
以下是 C 语言字符串操作的完整体系:
1. 核心定义:什么是 C 字符串?
C 语言的字符串是以 空字符 \0 (ASCII 0) 结尾的字符数组。
关键点:
\0的作用:它是字符串结束的标志。如果你创建一个字符数组忘了加\0,打印时就会出现乱码,甚至导致程序崩溃。- 空间分配:定义数组时,必须给
\0留一个位置。存 5 个字的单词,数组至少要长度 6。
2. 标准库函数 (<string.h>)
C 语言提供了一系列函数来操作字符串,必须引入头文件:
A. 获取长度 (strlen)
计算字符串的有效长度,不包含 \0。
B. 字符串复制 (strcpy)
不能直接用 = 给数组赋值,必须用复制函数。
注意:dest 必须足够大,否则会发生缓冲区溢出 (Buffer Overflow),这是 C 语言最常见的安全漏洞。
C. 字符串拼接 (strcat)
将一个字符串追加到另一个字符串后面。
D. 字符串比较 (strcmp)
不能用 == 比较两个字符串(那样比较的是内存地址)。
E. 查找字符/子串 (strchr, strrchr, strstr)
3. 安全版本的函数 (防止溢出)
为了防止写入越界,建议在生产环境中使用带 n 的版本,限制操作的字符数。
strcpy->strncpy(dest, src, n): 最多复制 n 个字符。strcat->strncat(dest, src, n): 最多追加 n 个字符。strcmp->strncmp(s1, s2, n): 只比较前 n 个字符。
注意:strncpy 有个坑,如果 src 长度超过 n,它不会自动在末尾添加 \0,你需要手动添加:
4. 字符串与数字转换 (<stdlib.h>)
处理文件或用户输入时,常需要将字符串转为数字。
5. 格式化字符串 (sprintf)
这是一个非常强大的函数,用于构造字符串。它的用法和 printf 一样,只是输出到了字符串数组中。
6. 输入输出
- 输出:
printf("%s", str)或puts(str)(puts 会自动换行)。 - 输入:
- 不推荐
scanf("%s", str): 遇到空格就会停止读取,且容易溢出。 - 推荐
fgets(str, size, stdin): 可以读取带空格的整行,且限制长度,非常安全。
- 不推荐
7. 综合实战示例
下面这个例子展示了:复制、拼接、比较、查找和格式化。
总结:C语言字符串避坑指南
- 内存空间:定义数组时,记得给
\0留位置(长度+1)。 - 赋值:不要用
=给数组赋值,用strcpy。 - 比较:不要用
==比较内容,用strcmp。 - 只读区:
char *p = "hello"这种字符串不能修改,想修改请用数组char p[] = "hello"。 - 安全性:尽量用
fgets替代scanf,用snprintf替代sprintf(如果支持的话),防止缓冲区溢出。

