strcpy strcat strcmp strstr memset memcpy memmove 模拟实现
strcpy strcat strcmp strstr memset memcpy memmove函数的介绍及模拟实现
   ·  
 介绍及模拟实现
| 函数 | 作用 | 头文件 | 
|---|---|---|
| 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 | 任意内存 | — | ✅ | 安全拷贝 | 
更多推荐
 
 



所有评论(0)