C语言:字符串函数strlen、strcpy、strcat、strcmp、strstr的介绍讲解
在 C 语言中,字符串处理函数是标准库 <string.h>
中提供的一组常用函数,用于操作以空字符 '\0'
结尾的字符串。以下是对 strlen
、strcpy
、strcat
、strcmp
和 strstr
函数的详细介绍和讲解,包括功能、用法、返回值以及示例代码。
1. strlen
– 计算字符串长度
功能
size_t strlen(const char *str);
- 计算字符串
str
的长度(不包括结尾的空字符'\0'
)。
返回值
- 返回字符串的长度(类型为
size_t
,无符号整数)。
注意事项
- 输入的字符串必须以
'\0'
结尾,否则可能导致未定义行为。 - 不计算空字符
'\0'
,仅计算实际字符数。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t len = strlen(str);
printf("字符串 '%s' 的长度是: %zu\n", str, len); // 输出: 13
return 0;
}
2. strcpy
– 复制字符串
功能
char *strcpy(char *dest, const char *src);
- 将字符串
src
(包括结尾的'\0'
)复制到目标字符串dest
中。
返回值
- 返回指向目标字符串
dest
的指针。
注意事项
dest
必须有足够的空间容纳src
及其空字符'\0'
,否则可能导致缓冲区溢出。dest
和src
不能重叠。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[20];
strcpy(dest, src);
printf("复制后的字符串: %s\n", dest); // 输出: Hello, World!
return 0;
}
3. strcat
– 拼接字符串
功能
char *strcat(char *dest, const char *src);
- 将字符串
src
(包括结尾的'\0'
)追加到目标字符串dest
的末尾(覆盖dest
原有的'\0'
,并在结果后添加新的'\0'
)。
返回值
- 返回指向目标字符串
dest
的指针。
注意事项
dest
必须有足够的空间容纳dest
原有内容、src
内容以及结尾的'\0'
。dest
和src
不能重叠。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello";
char src[] = ", World!";
strcat(dest, src);
printf("拼接后的字符串: %s\n", dest); // 输出: Hello, World!
return 0;
}
4. strcmp
– 比较字符串
功能
int strcmp(const char *str1, const char *str2);
- 按字典序比较两个字符串
str1
和str2
。
返回值
- 如果
str1
<str2
(字典序),返回负整数。 - 如果
str1
==str2
,返回 0。 - 如果
str1
>str2
(字典序),返回正整数。
注意事项
- 比较基于字符的 ASCII 值。
- 比较逐字符进行,直到遇到不同字符或
'\0'
。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "apple";
char str2[] = "banana";
int result = strcmp(str1, str2);
if (result < 0)
printf("%s 小于 %s\n", str1, str2); // 输出: apple 小于 banana
else if (result == 0)
printf("%s 等于 %s\n", str1, str2);
else
printf("%s 大于 %s\n", str1, str2);
return 0;
}
5. strstr
– 查找子字符串
功能
char *strstr(const char *haystack, const char *needle);
- 在字符串
haystack
中查找子字符串needle
第一次出现的位置。
返回值
- 如果找到子字符串,返回指向
haystack
中子字符串首次出现位置的指针。 - 如果未找到,返回
NULL
。
注意事项
- 查找区分大小写。
- 如果
needle
为空字符串,返回haystack
的指针。
示例代码
#include <stdio.h>
#include <string.h>
int main() {
char haystack[] = "Hello, World!";
char needle[] = "World";
char *result = strstr(haystack, needle);
if (result)
printf("子字符串 '%s' 在位置: %ld\n", needle, result - haystack); // 输出: 子字符串 'World' 在位置: 7
else
printf("未找到子字符串\n");
return 0;
}
综合示例
以下是一个综合使用这些函数的程序,展示它们如何协同工作:
#include <stdio.h>
#include <string.h>
int main() {
char str1[50] = "Hello";
char str2[] = ", World!";
char search[] = "World";
// 使用 strlen
printf("str1 长度: %zu\n", strlen(str1)); // 输出: 5
// 使用 strcat
strcat(str1, str2);
printf("拼接后: %s\n", str1); // 输出: Hello, World!
// 使用 strcpy
char copy[50];
strcpy(copy, str1);
printf("复制后: %s\n", copy); // 输出: Hello, World!
// 使用 strcmp
if (strcmp(str1, copy) == 0) {
printf("str1 和 copy 相等\n"); // 输出: str1 和 copy 相等
}
// 使用 strstr
char *pos = strstr(str1, search);
if (pos) {
printf("找到 '%s' 在位置: %ld\n", search, pos - str1); // 输出: 找到 'World' 在位置: 7
}
return 0;
}
总结
函数 | 功能 | 返回值 | 注意事项 |
---|---|---|---|
strlen | 计算字符串长度 | size_t (长度) | 确保字符串以 '\0' 结尾 |
strcpy | 复制字符串 | 目标字符串指针 | 目标缓冲区需足够大,防止溢出 |
strcat | 拼接字符串 | 目标字符串指针 | 目标缓冲区需足够大,防止溢出 |
strcmp | 比较字符串 | 整数(<0, 0, >0) | 基于 ASCII 值比较,区分大小写 |
strstr | 查找子字符串 | 指针或 NULL | 区分大小写,空子字符串返回原字符串指针 |
安全提示
- 缓冲区溢出:使用
strcpy
和strcat
时,需确保目标缓冲区有足够空间。现代 C 编程推荐使用更安全的替代函数,如strncpy
和strncat
。 - 空指针检查:调用这些函数前,确保输入字符串非空。
- 字符串结尾:所有函数假设字符串以
'\0'
结尾,否则可能引发未定义行为。
如果需要更详细的解释或特定用法的示例,请告诉我!