C语言处理字符串的十个函数(附带大量实例)

C语言的字符串处理函数主要集中在 <string.h> 头文件中,使用这些函数前必须包含该头文件。
字符串处理函数操作的对象通常是字符串(以 \0 结尾的字符数组),它们极大地方便了文本处理任务。
以下是我们将要讲解的主要函数:
strlen():计算字符串长度strcpy()和strncpy():复制字符串strcat()和strncat():连接字符串strcmp()和strncmp():比较字符串strchr()和strrchr():查找字符strstr():查找子字符串
1、strlen()计算字符串长度
strlen() 函数的原型如下:
size_t strlen(const char *str);
str:要计算长度的字符串。- 返回值:字符串的长度(不包括
\0),类型为size_t(无符号整数)。
例如:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
size_t len = strlen(str);
printf("字符串长度:%zu\n", len);
return 0;
}
输出结果:
字符串长度:5
strlen() 只计算实际字符数,不包括末尾的 \0。如果传入的不是以 \0 结尾的字符数组,结果将是未定义的。
2、strcpy() 和 strncpy()复制字符串
1) strcpy()
strcpy() 将源字符串(包括 \0)复制到目标字符串。
char *strcpy(char *dest, const char *src);
dest:目标字符数组。src:源字符串。- 返回值:指向
dest的指针。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "hello";
char dest[10];
strcpy(dest, src);
printf("复制后的字符串:%s\n", dest);
return 0;
}
输出结果:
复制后的字符串:hello
注意:dest 必须有足够的空间容纳 src,否则会引发缓冲区溢出。
2) strncpy()
strncpy 是更安全的版本,允许指定复制的最大字符数。
char *strncpy(char *dest, const char *src, size_t n);
n:最多复制的字符数。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "hello world";
char dest[6];
strncpy(dest, src, 5); // 只复制前 5 个字符
dest[5] = '\0'; // 手动添加结束符
printf("复制后的字符串:%s\n", dest);
return 0;
}
输出结果:
复制后的字符串:hello
注意:strncpy 不会自动添加 \0,如果 n 小于 src 长度,需手动补上。
3、strcat() 和 strncat()连接字符串
1) strcat()
strcat() 将源字符串追加到目标字符串末尾。
char *strcat(char *dest, const char *src);
示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "hello";
char src[] = " world";
strcat(dest, src);
printf("连接后的字符串:%s\n", dest);
return 0;
}
输出结果:
连接后的字符串:hello world
2) strncat()
strncat() 限制追加的字符数。
char *strncat(char *dest, const char *src, size_t n);
示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "hello";
char src[] = " world";
strncat(dest, src, 3); // 只追加 " wo"
printf("连接后的字符串:%s\n", dest);
return 0;
}
输出结果:
连接后的字符串:hello wo
strncat 会自动添加 \0,无需手动补齐。
4、strcmp() 和 strncmp()比较字符串
1) strcmp()
strcmp 按字典序比较两个字符串。
int strcmp(const char *str1, const char *str2);
- 返回值:
- 0:两字符串相等
- 正数:
str1大于str2 - 负数:
str1小于str2
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0) printf("str1 < str2\n");
else if (result > 0) printf("str1 > str2\n");
else printf("str1 == str2\n");
return 0;
}
输出结果:
str1 < str2
2) strncmp()
strncmp() 只比较前 n 个字符。
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "apricot";
int result = strncmp(str1, str2, 2);
if (result == 0) printf("前 2 个字符相等\n");
return 0;
}
输出结果:
前 2 个字符相等
5、strchr() 和 strrchr()查找字符
1) strchr()
strchr() 查找字符在字符串中第一次出现的位置。
char *strchr(const char *str, int c);
c:要查找的字符(传入 int,但实际按 char 处理)。- 返回值:指向首次出现位置的指针,或
NULL(未找到)。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
char *pos = strchr(str, 'l');
if (pos) printf("'l' 首次出现位置:%ld\n", pos - str);
return 0;
}
输出结果:
'l' 首次出现位置:2
2)strrchr()
strrchr() 查找最后一次出现的位置。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello";
char *pos = strrchr(str, 'l');
if (pos) printf("'l' 最后出现位置:%ld\n", pos - str);
return 0;
}
输出结果:
'l' 最后出现位置:3
6、strstr()查找子字符串
strstr() 查找子字符串首次出现的位置。
char *strstr(const char *haystack, const char *needle);
haystack:被查找的字符串。needle:要查找的子字符串。
示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "hello world";
char *pos = strstr(str, "world");
if (pos) printf("子字符串位置:%ld\n", pos - str);
return 0;
}
输出结果:
子字符串位置:6
函数对比表格
| 函数 | 功能 | 返回值 | 注意事项 |
|---|---|---|---|
strlen() | 计算长度 | size_t | 不含 \0 |
strcpy() | 复制字符串 | char * | 可能溢出 |
strncpy() | 有限复制 | char * | 需手动加 \0 |
strcat() | 连接字符串 | char * | 需确保空间 |
strcmp() | 比较字符串 | int | 字典序 |
注意事项
- 头文件:始终包含
<string.h>。 - 安全性:避免缓冲区溢出,优先使用
strncpy和strncat。 - 空指针:查找函数返回
NULL时需检查。

