函数 作用 头文件
strcpy 字符串复制 <string.h>
strcat 字符串拼接 <string.h>
strcmp 字符串比较 <string.h>
strstr 查找子串 <string.h>
memset 内存区域填充 <string.h>
memcpy 内存拷贝(不重叠) <string.h>
memmove 内存拷贝(支持重叠) <string.h>

strcpy — 字符串复制

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

功能说明

将 src 字符串复制到 dest 所指的内存中,包括 ‘\0’ 结束符。

模拟实现

char *my_strcpy(char *dest, const char *src)
{
    char *ret = dest;
    while ((*dest++ = *src++));  // 包括 '\0'
    return ret;
}

说明

  • 必须确保 dest 有足够的空间。

  • 复制结束条件是遇到'\0'


strcat — 字符串拼接

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

功能说明

把 src 字符串追加到 dest 后面,返回 dest。

模拟实现

char *my_strcat(char *dest, const char *src)
{
    char *ret = dest;
    while (*dest) dest++;        // 找到末尾 '\0'
    while ((*dest++ = *src++));  // 复制 src,包括 '\0'
    return ret;
}

注意

  • dest 必须足够大,否则会溢出。

strcmp — 字符串比较

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

功能说明

按字典序比较两个字符串。

模拟实现

int my_strcmp(const char *s1, const char *s2)
{
//只要 s1 当前不是字符串结束符 '\0',并且 s1、s2 当前字符相等。
    while (*s1 && (*s1 == *s2)) {
        s1++;
        s2++;
    }
    return (unsigned char)*s1 - (unsigned char)*s2;
}
返回值 含义
< 0 s1 < s2
= 0 s1 == s2
> 0 s1 > s2

strstr — 查找子串

char *strstr(const char *haystack, const char *needle);

功能说明

在字符串 haystack 中查找第一次出现的子串 needle。

模拟实现

char *my_strstr(const char *haystack, const char *needle)
{
//犹豫历史兼容问题这里是强转成char*,但其实这样是危险的
    if (!*needle) return (char *)haystack; 

    const char *p1, *p2;
    while (*haystack) {
        p1 = haystack;
        p2 = needle;
        while (*p1 && *p2 && (*p1 == *p2)) {
            p1++;
            p2++;
        }
        if (!*p2)
            return (char *)haystack;  // 匹配成功
        haystack++;
    }
    return NULL;
}

示例

char s[] = "hello world";
char *p = my_strstr(s, "lo");
printf("%s\n", p);  // 输出 "lo world"

memset — 内存填充

void *memset(void *s, int c, size_t n);

功能说明

将某个内存区域的前 n 个字节设置为指定值(通常是 0)。

模拟实现

void *my_memset(void *s, int c, size_t n)
{
		//注意signed char 可能会因为符号位扩展导致错误解释。
    unsigned char *p = (unsigned char *)s;
    while (n--)
        *p++ = (unsigned char)c;
    return s;
}

示例

int arr[5];
my_memset(arr, 0, sizeof(arr)); // 清零数组

memcpy — 内存拷贝(不重叠)

void *memcpy(void *dest, const void *src, size_t n);

功能说明

从源地址 src 拷贝 n 字节到目的地址 dest。
不适用于内存重叠情况。

模拟实现

void *my_memcpy(void *dest, const void *src, size_t n)
{
    unsigned char *d = (unsigned char *)dest;
    const unsigned char *s = (const unsigned char *)src;
    while (n--)
        *d++ = *s++;
    return dest;
}

注意

  • 如果 dest 和 src 内存区域重叠,结果是未定义行为。

memmove — 内存拷贝(支持重叠)

void *memmove(void *dest, const void *src, size_t n);

功能说明

与 memcpy 类似,但可以安全地处理重叠区域。

模拟实现

void *my_memmove(void *dest, const void *src, size_t n)
{
    unsigned char *d = (unsigned char *)dest;
    const unsigned char *s = (const unsigned char *)src;

    if (d < s) {
        // 正向拷贝
        while (n--)
            *d++ = *s++;
    } else if (d > s) {
        // 反向拷贝(避免覆盖)
        d += n;
        s += n;
        while (n--)
            *(--d) = *(--s);
    }
    return dest;
}

函数 操作对象 是否拷贝 \0 是否允许重叠 主要用途
strcpy 字符串 字符串复制
strcat 字符串 字符串拼接
strcmp 字符串 比较大小
strstr 字符串 查找子串
memset 任意内存 初始化
memcpy 任意内存 快速拷贝
memmove 任意内存 安全拷贝
Logo

更多推荐