字符串并不是 C 语言内置的基础类型,本质上就是字符数组。想要获取长度、完成复制、拼接或是对比操作,都需要调用库函数。接下来介绍 <string.h> 中最常用的几组函数,结合示例逐一说明。
为什么需要 string.h
大部分字符串操作其实都能自己写循环实现,但那样啰嗦又容易出错。C 标准库在 <string.h> 里提供了成套的字符串处理函数,帮你把常见操作封装好。
使用前必须包含头文件:
#include <string.h>最常用的字符串函数
| 函数 | 说明 |
|---|---|
strlen() | 计算字符串长度 |
strcpy() | 把一个字符串复制到另一个 |
strcat() | 拼接(连接)两个字符串 |
strcmp() | 比较两个字符串 |
strlwr() | 把字符串转成小写 |
strupr() | 把字符串转成大写 |
逐个看用法
strlen():求长度
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello";
printf("长度 = %lu\n", strlen(str)); // 5,不算结尾的 \0
return 0;
}strcpy():复制
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "World";
char dst[20];
strcpy(dst, src); // 把 src 复制到 dst
printf("%s\n", dst); // World
return 0;
}注意目标数组要够大,能装下源字符串再加结尾的 \0,否则溢出。
strcat():拼接
#include <stdio.h>
#include <string.h>
int main() {
char s1[20] = "Hello ";
char s2[] = "World";
strcat(s1, s2); // 把 s2 接到 s1 末尾
printf("%s\n", s1); // Hello World
return 0;
}s1 的目标空间要留够,否则拼接时会越界。
strcmp():比较
返回值 0 表示相等,负数表示第一个串小,正数表示第一个串大(按 ASCII 逐字符比):
#include <stdio.h>
#include <string.h>
int main() {
if (strcmp("abc", "abc") == 0)
printf("相等\n");
if (strcmp("abc", "abd") < 0)
printf("abc 在 abd 之前\n");
return 0;
}注意:比字符串要用 strcmp(),不能用 ==,== 比的是两个指针(地址),不是内容。
gets() 和 puts()
严格说它们不归 string.h 管,但也是字符串输入输出的一对常用函数,定义在 stdio.h 里:
#include <stdio.h>
int main() {
char name[30];
printf("输入姓名: ");
gets(name); // 从用户输入读一行字符串
printf("姓名: ");
puts(name); // 输出字符串并自动换行
return 0;
}注意 gets() 不检查缓冲区大小,历史上出过著名的缓冲区溢出漏洞,现代编译器常提示用 fgets() 替代。
字符串的操作交给 string.h,strlen 量长度、strcpy 复制、strcat 拼接、strcmp 比较,比较要用函数,不能直接用 ==。