C语言:字符串函数strlen、strcpy、strcat、strcmp、strstr的介绍讲解

在 C 语言中,字符串处理函数是标准库 <string.h> 中提供的一组常用函数,用于操作以空字符 '\0' 结尾的字符串。以下是对 strlenstrcpystrcatstrcmpstrstr 函数的详细介绍和讲解,包括功能、用法、返回值以及示例代码。


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',否则可能导致缓冲区溢出。
  • destsrc 不能重叠。

示例代码

#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'
  • destsrc 不能重叠。

示例代码

#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);

  • 按字典序比较两个字符串 str1str2

返回值

  • 如果 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区分大小写,空子字符串返回原字符串指针

安全提示

  • 缓冲区溢出:使用 strcpystrcat 时,需确保目标缓冲区有足够空间。现代 C 编程推荐使用更安全的替代函数,如 strncpystrncat
  • 空指针检查:调用这些函数前,确保输入字符串非空。
  • 字符串结尾:所有函数假设字符串以 '\0' 结尾,否则可能引发未定义行为。

如果需要更详细的解释或特定用法的示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注