(C语言篇)处理字符串的四个基础函数

strlenstrcpystrcatstrcmp使用以及注意事项

在C语言中,strlenstrcpystrcatstrcmp是处理字符串的四个基础函数,都在<string.h>头文件中声明。下面为你详细介绍它们的功能、用法和注意事项。

1. strlen - 计算字符串长度

函数原型

size_t strlen(const char *s);

功能:计算字符串s的有效长度(不包含终止符'\0')。
示例

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "Hello";
    printf("长度: %zu\n", strlen(str));  // 输出: 5
    printf("sizeof: %zu\n", sizeof(str)); // 输出: 6(包含'\0')
    return 0;
}

注意点

  • 字符串必须以'\0'结尾,否则会导致越界访问。
  • 返回值类型是size_t(无符号整数),进行减法运算时要特别注意溢出问题。

2. strcpy - 复制字符串

函数原型

char *strcpy(char *dest, const char *src);

功能:把src字符串(包含'\0')复制到dest
示例

#include <stdio.h>
#include <string.h>

int main() {
    char src[] = "Hello";
    char dest[10];
    strcpy(dest, src);
    printf("复制结果: %s\n", dest);  // 输出: Hello
    return 0;
}

注意点

  • dest必须有足够的空间,否则会引发缓冲区溢出。
  • 会覆盖dest原有的内容。
  • 建议使用更安全的strncpy,但要手动添加'\0'
    strncpy(dest, src, sizeof(dest) - 1);
    dest[sizeof(dest) - 1] = '\0';  // 确保以'\0'结尾
    

3. strcat - 连接字符串

函数原型

char *strcat(char *dest, const char *src);

功能:将src字符串(包含'\0')追加到dest的末尾。
示例

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

注意点

  • dest必须有足够的空间容纳src,否则会导致缓冲区溢出。
  • dest必须是一个已经以'\0'结尾的字符串。
  • 建议使用更安全的strncat
    strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
    

4. strcmp - 比较字符串

函数原型

int strcmp(const char *s1, const char *s2);

功能:按字典序比较s1s2,返回值规则如下:

  • s1 < s2,返回负数(通常是-1,但标准未明确规定具体值)。
  • s1 == s2,返回0。
  • s1 > s2,返回正数(通常是1,但标准未明确规定具体值)。
    示例
#include <stdio.h>
#include <string.h>

int main() {
    char s1[] = "apple";
    char s2[] = "banana";
    if (strcmp(s1, s2) < 0) {
        printf("%s 在 %s 之前\n", s1, s2);  // 输出: apple 在 banana 之前
    }
    return 0;
}

注意点

  • 比较的是字符的ASCII值(或当前字符集的编码值)。
  • 常用于字符串排序或判断字符串是否相等(返回0表示相等)。
  • 大小写会影响比较结果,例如"Apple""apple"是不同的。

安全替代函数

为避免缓冲区溢出,建议优先使用以下更安全的函数:

原函数安全替代函数区别
strcpystrncpy需要手动添加'\0'
strcatstrncat自动追加'\0',但需指定最大追加长度
-snprintf可替代strcpystrcat,更安全

总结

函数功能返回值关键风险
strlen(s)计算字符串s的长度size_t类型的长度值字符串未以'\0'结尾会导致越界
strcpy(dest, src)复制srcdestdest的指针可能引发缓冲区溢出
strcat(dest, src)src追加到dest末尾dest的指针可能引发缓冲区溢出
strcmp(s1, s2)比较s1s2整数(<0、0、>0)-

手动实现:

#include <stddef.h>  // 提供size_t类型定义

/* 计算字符串长度(不包含终止符'\0') */
size_t strlen(const char *s) {
    const char *p = s;
    while (*p != '\0') {  // 遍历直到遇到字符串结束符
        p++;
    }
    return p - s;  // 指针相减得到字符数量
}

/* 复制字符串src到dest(包含终止符'\0') */
char *strcpy(char *dest, const char *src) {
    char *original_dest = dest;  // 保存原始指针用于返回
    while ((*dest++ = *src++) != '\0');  // 复制每个字符直到遇到'\0'
    return original_dest;  // 返回目标字符串起始地址
}

/* 将字符串src追加到dest末尾(覆盖dest的终止符) */
char *strcat(char *dest, const char *src) {
    char *original_dest = dest;
    // 定位到dest的终止符位置
    while (*dest != '\0') {
        dest++;
    }
    // 从dest的终止符位置开始复制src
    while ((*dest++ = *src++) != '\0');
    return original_dest;  // 返回目标字符串起始地址
}

/* 按字典序比较两个字符串 */
int strcmp(const char *s1, const char *s2) {
    while (*s1 == *s2) {  // 比较相同位置的字符
        if (*s1 == '\0') {  // 如果同时到达终止符,说明字符串相等
            return 0;
        }
        s1++;
        s2++;
    }
    // 返回第一个不相等字符的差值(ASCII码差值)
    return (unsigned char)*s1 - (unsigned char)*s2;
}
  1. strlen
    • 使用指针遍历字符串,直到遇到 '\0'
    • 通过指针减法计算字符数量
    • 返回类型为 size_t(无符号整数)
  2. strcpy
    • 使用后置递增运算符同时移动指针和赋值
    • 循环条件包含赋值操作,自动处理终止符 '\0'
    • 返回原始目标指针以便链式调用
  3. strcat
    • 先定位到 dest 的终止符位置
    • 从终止符位置开始复制 src 内容(包含终止符)
    • 不检查 dest 空间是否足够,需调用者确保
  4. strcmp
    • 逐字符比较直到发现差异或结束
    • 返回值为第一个不相等字符的差值
    • 使用 unsigned char 转换避免符号扩展导致的比较错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值