模拟实现字符串函数和内存操作函数

1.实现strcpy

my_strcpy( ) 函数是把原字符串拷贝到目标空间里,也会拷贝最后的原字符串中的‘\0’。

<1>函数的参数设计:
int main()
{
    char arr[20] = { 0 };
    my_strcpy(arr, "hello world");
}

数组名arr是首元素地址,因为每个元素都是char,所以首元素地址就是char的地址,char的地址就是char*,所以第一个参数用char*接收;
helloworld传过去是首字符‘h’的地址,也应用char*接收;
设计如下:

char* my_strcpy(char* dest,const char* src);
<2>代码实现
char* my_strcpy(char* dest,const char* src)
{
    while (*src != '\0')
    {
        *dest = *src;
        dest++;
        src++;
    }
    *dest = *src;//拷贝\0
}

//以上my_strcpy()可以优化:
char* my_strcpy(char* dest,const char* src)
{
    char *ret = dest;
    assert(dest&&src);
    //++比*高级,先++,但由于是后置++  → 先使用,后自加
    //先拷贝后++
    //拷到最后一个\0的时候 \0 = \0   表达式值为0  跳出循环
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr[20] = { 0 };
    my_strcpy(arr, "hello world");
    printf("%s\n", arr);
    return 0;
}

2.实现strcat

strcat( )是 字符串连接/追加

char* my_strcat(char* dest, const char* src)
{
    char* ret = dest;
    assert(dest && src);
    //找des指向字符串的'\0'
    while (*dest)
    {
        dest++;
    }
    //拷贝字符串
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}
int main()
{
    char arr1[20] = "hello";
    char arr2[] = "world";
    my_strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

3.实现strstr

<1>介绍

strstr ()函数是在字符串中查找一个子字符串,返回的是子字符串在字符串中第一次出现的位置。
例如:
字符串: “abcdefabcdef”中找子字符串:“bcd”
“bcd”出现两次 ,返回的是第一次出现bcd的位置,结果是bcdefabcdef

<2>代码
char* my_strstr(const char*str, const char*substr)
{
    assert(str && substr);
    const char* cur = str;
    const char* s1 = str;
    const char* s2 = substr;
    if (*substr == '\0')
    {
        return (char*)str;//
    }
    while (*cur)
    {
        s1 = cur;
        s2 = substr;
        while (*s1 && *s2 && *s1 == *s2)
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return (char*)cur;
        }
        if (*s1 == '\0')
        {
            return NULL;
        }
        cur++;
    }
    return NULL;
}
int main()
{
    char *p = "abcdefabcdef";
    char *q = "bcq";
    char* ret = my_strstr(p, q);
    if (ret != NULL)
    {
        printf("找到了%s\n", ret);

    }
    else
    {
        printf("找不到\n");
    }
    return 0;
}

4.实现strchr

strchr()函数是在字符串中搜索一个字符,并返回字符第一次出现的地址;

char* my_strchr(char *str, int x)
{
    assert(str != NULL);
    while (*str)
    {
        if (*str == x)
        {
            return str;
        }
        str++;
    }
    return NULL;
}
int main()
{
    char *p = "abcd";
    int ch = 'c';
    char *ret = my_strchr(p, ch);
    printf("%s\n", ret);
    return 0;
}

5.实现strcmp

<1>介绍

strcmp() 是比较两个字符串之间每一对的大小,不是比较长度;
例如:
“abc” “abc”相等 返回0
“abc” “ab” 不相等 若第一个字符串大于第二个字符串返回大于0的数字,若小于返回小于0的数字

<2>代码
int my_strcmp(const char*s1,const char*s2)
{
    assert(s1 && s2);
    while(*s1 == *s2)
    {
        if (*s1 == '\0')
        {
            return 0;
        }
        s1++;
        s2++;
    }
    return *s1-*s2;
}
int main()
{
    char *p1 = "abcdef";
    char *p2 = "bbbbbb";
    printf("%d\n", my_strcmp(p1, p2));
    return 0;
}

6.实现memcpy

memcpy()是内存拷贝,可以拷贝char型,int型等等;

<1>.分析一下为什么有了strcpy函数,还要有memcpy函数
(1) char arr1[10] = "abcdef";
        char arr2[5] = { 0 };
        strcpy(arr1, arr2);//拷贝的结果是只拷贝过去第一个0(\0),就停止了


(2) int arr1[10] = { 0 };
        int arr2[5] = { 1, 2, 3, 4, 5 };
        //01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
        //整型是四个字节,strcpy()是一个字节一个字节的拷贝,第二个就遇到了00(\0)
        strcpy(arr1, arr2);
        //strcpy的参数是char*的,而这两数组是int*,有类型冲突,有警告
<2>代码
//void *   无类型指针
void* my_memcpy(void *dest,const void *src,size_t count)
{
    void *ret = dest;
    assert(dest && src);

    while (count--)
    {
        *(char *)dest = *(char *)src;
        dest = (char *)dest + 1;
        src = (char *)src +1;
    }
    return ret;
}
int main()
{
    int arr1[10] = { 0 };
    int arr2[5] = { 1, 2, 3, 4, 5 };
    my_memcpy(arr1, arr2,20);
    return 0;
}

7.实现memmove

<1>分析

这里写图片描述
这里写图片描述

<2>代码
void* my_memmove(void*dest, const void*src, size_t count)
{
    void*ret = dest;
    assert(dest && src);
    if (dest < src)
    {
        //从前向后拷贝
        while (count--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后向前拷贝
        while (count--)
        {
            *((char*)dest + count) = *((char*)src + count);
        }
    }
    return ret;
}
int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    memmove(arr, arr + 2, 16);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中常用的字符串替换函数是`str_replace`,它可以在一个字符串中查找并替换指定的子字符串。下面我将简单地模拟实现一个`str_replace`函数。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> char* str_replace(const char* str, const char* search, const char* replace) { char* result; int search_len = strlen(search); int replace_len = strlen(replace); int count = 0; // 统计需要替换的次数 const char* s = str; while ((s = strstr(s, search)) != NULL) { count++; s += search_len; } // 计算替换后的字符串长度 int result_len = strlen(str) + count * (replace_len - search_len); result = (char*)malloc(result_len + 1); // 开始替换 char* p = result; s = str; while ((s = strstr(s, search)) != NULL) { int n = s - str; strncpy(p, str, n); p += n; strncpy(p, replace, replace_len); p += replace_len; str = s + search_len; } strcpy(p, str); return result; } int main(void) { const char* str = "Hello, world!"; const char* search = "world"; const char* replace = "everyone"; char* result = str_replace(str, search, replace); printf("替换前: %s\n", str); printf("替换后: %s\n", result); free(result); return 0; } ``` 上述代码实现了一个简单的`str_replace`函数。它首先统计了需要替换的次数,并根据替换的次数计算了替换后的字符串长度。然后,它分配了足够的内存空间来存储替换后的字符串,并进行了替换操作。最后,它返回了替换后的字符串。在`main`函数中,我们可以看到如何使用这个函数来替换一个字符串中的子字符串。 需要注意的是,本示例只是对`str_replace`函数的简单模拟实现,实际使用中还需要处理更多的边界情况和错误处理。 ### 回答2: C语言中没有内置的字符串替换函数,但我们可以通过模拟实现一个字符串替换函数。 首先,我们可以定义一个函数,该函数接受三个参数:源字符串、待替换的子字符串、替换后的子字符串函数的返回值是替换完成后的字符串。 接下来,我们可以使用循环来遍历源字符串。在每次循环中,比较源字符串中是否存在待替换的子字符串。如果存在,我们就将替换后的子字符串复制到新的字符串中。如果不存在,我们将源字符串中的当前字符复制到新的字符串中。 最后,返回新的字符串即可。 下面是一个简单的模拟实现示例: ```c #include <stdio.h> #include <string.h> char* stringReplace(char* source, const char* search, const char* replace) { char* result; int i, j, sourceLen, searchLen, replaceLen, count; sourceLen = strlen(source); searchLen = strlen(search); replaceLen = strlen(replace); count = 0; for (i = 0; i < sourceLen; i++) { if (strstr(&source[i], search) == &source[i]) { count++; i += searchLen - 1; } } result = (char*)malloc(sourceLen + count * (replaceLen - searchLen) + 1); i = 0; j = 0; while (source[i]) { if (strstr(&source[i], search) == &source[i]) { strcpy(&result[j], replace); j += replaceLen; i += searchLen; } else result[j++] = source[i++]; } result[j] = '\0'; return result; } int main() { char source[] = "Hello, World!"; const char search[] = "World"; const char replace[] = "C Language"; char* result = stringReplace(source, search, replace); printf("替换后的字符串: %s\n", result); free(result); return 0; } ``` 这是一个简单的模拟实现,实际上字符串替换还涉及到更多复杂的情况和细节,比如大小写敏感、替换次数限制等等。需要根据实际需求进行更进一步的完善。 ### 回答3: C语言字符串替换函数模拟实现的方法有很多,以下是一种可能的实现方式: ```c #include <stdio.h> #include <string.h> void str_replace(char *str, const char *find, const char *replace) { int find_len = strlen(find); int replace_len = strlen(replace); int str_len = strlen(str); char result[100]; int result_len = 0; int i = 0; while (i < str_len) { if (strncmp(&str[i], find, find_len) == 0) { // 找到需要替换的字符串 strncpy(&result[result_len], replace, replace_len); result_len += replace_len; // 跳过被替换的部分 i += find_len; } else { // 将原字符串的字符复制到结果字符串中 result[result_len] = str[i]; result_len++; i++; } } // 将新的结果字符串复制回原字符串中 strncpy(str, result, result_len); str[result_len] = '\0'; } int main() { char str[100] = "Hello, World!"; char find[10] = "World"; char replace[10] = "Alice"; printf("Before replace: %s\n", str); str_replace(str, find, replace); printf("After replace: %s\n", str); } ``` 这个函数的思路是首先计算出原字符串、需要查找的字符串以及替换的字符串的长度。然后以原字符串为基础,通过遍历每个字符的方式,查找需要替换的字符串,然后将替换的字符串复制到结果字符串中,同时跳过原字符串中已经被替换的部分。最后将结果字符串复制回原字符串中,完成字符串的替换。在主函数中,我们可以看到使用这个函数对原始字符串中的特定字符串进行了替换操作。运行程序后,可以输出替换后的字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值