C 字符串是以 \0 结尾的 char 数组。<string.h> 提供长度、复制、拼接与比较函数;调用者必须保证目标缓冲区容量足够。
#include <stdio.h>
#include <string.h>
int main(void) {
char first[16] = "Leaf";
char second[] = "let";
strcat(first, second);
printf("%s has %zu characters\n", first, strlen(first));
return 0;
}strlen:数到终止符
strlen 从第一个字符开始扫描,遇到 \0 停止,返回的长度不包含终止符。
互动实验
strlen 终止符扫描器
访问权限免费
单步移动扫描指针:每读到一个普通字符,长度加 1;读到 \0 时立即停止,终止符不计入长度。
0Lp
1e
2a
3f
4\0
strcpy:覆盖目标缓冲区
strcpy(destination, source) 连同末尾的 \0 一起复制。目标数组必须容得下完整结果。
互动实验
strcpy 逐字符复制
访问权限免费
目标缓冲区最初为空。每一步把 source[i] 写入 destination[i],最后一步必须把 \0 也复制过去。
source
C0o1d2e3\04
source[0] → destination[0]
destination
·0·1·2·3·4
destination[0] = source[0];复制字符 “C”。
strcat:从终止符处追加
strcat(destination, source) 找到目标字符串的 \0,从那里追加 source,再写入新的终止符。
互动实验
strcat 拼接缓冲区
访问权限免费
先扫描 destination 找到原来的 \0,再从这个位置开始逐字符复制 source,最后写入新的 \0。
1 寻找 destination 的 \02 复制 source 与新 \0
destination[9]
L0e1a2f3\04·5·6·7·8
source
let\0
当前动作
destination[0] != '\0'继续向右扫描,原字符串内容不会被覆盖。
strcmp:按字符顺序比较
strcmp(a, b) 返回负数、0 或正数。结果的符号表示字典顺序,不保证恰好是 -1 或 1。
互动实验
strcmp 首个差异定位器
访问权限免费
同时扫描两个字符串:字符相等就继续;遇到第一对不同字符就根据编码大小决定结果正负。
a = "cat"
c99a97t116\00
=
b = "car"
c99a97r114\00
知识测验
题目
strlen("cat") 返回多少?
知识测验
题目
strcpy(destination, source) 会修改哪个字符串?
知识测验
题目
调用 strcat 前最重要的容量条件是什么?
知识测验
题目
strcmp(a, b) 返回 0 表示什么?
动手练习
安全拼接姓名
读取名和姓,在固定容量的缓冲区中安全生成“名 空格 姓”,容量不足时输出错误。
- 分别读取 first 和 last,并去掉换行。
- 在拼接前计算 strlen(first) + strlen(last) + 2。
- 容量足够时再执行复制与拼接。
动手练习
按字典序排列三个单词
读取三个单词,使用 strcmp 比较内容,并按字典序从小到大输出。
- 把三个单词保存在二维字符数组中。
- 比较相邻字符串,顺序错误时交换整段字符内容。
- 完成排序后逐行输出三个单词。
动手练习
合并两行文本
安全读取两行文本,把它们合并到一个容量足够的字符数组中,并在两行之间加入一个空格。
- 使用 fgets 分别读取两行,并移除行尾换行。
- 计算两行、空格与终止符所需的总容量。
- 容量足够时依次复制第一行、空格和第二行。