模拟库中的字符串处理函数

来源:互联网 发布:淘宝客如意投怎么设置 编辑:程序博客网 时间:2024/06/05 15:03

1.模拟实现strcpy函数的功能

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strcpy(char *dst,char const *src){    char *ret = dst;    assert(dst);    assert(src);    while (*dst++ = *src++);    return ret;}int main(){    char *msg = "hello world";    char str[20] = {0};    printf("%s \n",my_strcpy(str,msg));    system("pause");    return 0;}

2.实现strncpy函数

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>char *my_strncpy(char *dst,char const *src,int n){    char *ret = dst;    assert(dst);    assert(src);    //如果拷贝的字符串长度小于源字符串的长度,则将会输出一个不合法的字符串,可能会输出乱码    while (n-- && *src != '\0' )    {        *dst++ = *src++;    }    //如果拷贝的长度小于源字符串的长度    if (n != 0)    {        while (n--)        {            *dst = '\0';//应该将dst剩余的空间内容置为'\0'        }    }    return ret;}int main(){    char *msg = "hello world";    char str[20] ;    int num = 0;    printf("Please Enter your number of copy:>");    scanf("%d",&num);    printf("%s \n",my_strncpy(str,msg,num));    system("pause");    return 0;}

当拷贝的字符串长度小于源字符串的长度时,输出结果如下:

这里写图片描述

3.实现strcat函数的功能:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *my_strcat(char *dst,char const *src){    char *dst_end = dst + strlen(dst) ;    char *ret = dst_end;    assert(dst);    assert(src);    while (*dst_end++ = *src++);    return dst;}int main(){    char dst[40] = "I love ";    char *src = " my nation";    printf("%s\n",my_strcat(dst,src));    system("pause");    return 0;}

4.实现strncat函数的功能

#pragma warning(disable : 4996)#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>char *my_strncat(char *dst,const char *src,int n){    assert(dst);    assert(src);    char *dst_end = dst + strlen(dst);    while ((*src != '\0') && (n--))    {        *dst_end++ = *src++;     }    *dst_end = '\0';    return dst;}int main(){    char *src = "world";    char dst[32] = "hello";    my_strncat(dst,src,29);    printf("%s \n",dst);    system("pause");    return 0;}

5.实现strcmp函数

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(char const *str1,char const *str2){    assert(str1);    assert(str2);    while (*str1 != '\0' && *str2 != '\0')//判断字符串中对应字符的大小    {        if(*str1 > *str2)        {            return 1;//str1大于str2中的字符,返回1        }        else if(*str1 < *str2)        {            return -1;//str1小于str2中的字符,返回-1        }        else        {            str1++,str2++;//对应的字符相等,则比较下一个字符        }    }    if (*str1 == '\0' && *str2 != '\0')    {        return -1;    }    else if(*str1 != '\0' && *str2 == '\0')    {        return 1;    }    else        return 0;}int main(){    char *str1 = "hello world";    char *str2 = "hello world";    printf("%d\n",my_strcmp(str1,str2));    system("pause");    return 0;}

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strcmp(const char *str1,const char *str2){    assert(str1);    assert(str2);    while (*str1 == *str2)    {        if (*str1 == '\0')        {            return 0;        }    }    return *str1 - *str2;}int main(){    const char *str1 = "bcdefg";    const char *str2 = "abcdefg";    int ret = my_strcmp(str1,str2);    if (ret > 0)    {        printf("str1 > str2\n");    }    else if(ret < 0)    {        printf("str1 < str2\n");    }    else    {        printf("str1 = str2\n");    }    system("pause");    return 0;}

这里写图片描述

6.实现strncmp函数

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>int my_strncmp(const char *str1,const char *str2,int n){    assert(str1);    assert(str2);    while (n-- && (*str1 == *str2))    {        if (*str1 == '\0')        {            return 0;        }        str1++,str2++;    }    return *str1 - *str2;}int main(){    char *str1 = "abs";    char *str2 = "absb";    int ret = my_strncmp(str1,str2,5);    printf("%d \n",ret);    system("pause");    return 0;}

这里写图片描述

7.实现memcpy函数的实现
(标准规定:两块空间之间没有关联,简单的说,就是两块空间没有重叠)

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void *my_memcpy(void *dst,void const *src,int count){    void *ret = dst;    assert(dst);    assert(src);    while (count--)    {        *(char*)dst = *(char*)(src);        dst = (char *)dst + 1;        src = (char *)src + 1;    }    return ret;}int main(){    char dest[40] = "this is a game";    char *src = "hello";    char *ret = (char *)my_memcpy(dest,src,sizeof(char) * strlen (src));    printf("%s\n",ret);    system("pause");    return 0;}

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void show(int *arr,int sz){    int i = 0;    for (i = 0; i < sz; i++)    {        printf("%d ",arr[i]);    }    printf("\n");}void *my_memcpy(void *dst,void *src,int sz){    char *pdst = (char *)dst;    char *psrc = (char *)src;    assert(dst);    assert(src);    assert(sz > 0);    while (sz--)    {        *pdst++ = *psrc++;    }    return dst;}int main(){    int arr1[] = {1,2,3,4,5,6,7,8,9,0};    int arr2[10];    int sz = sizeof(arr1);    my_memcpy(arr2,arr1,sz);    show(arr2,sz/sizeof(int));    system("pause");    return 0;}

结果如下:
这里写图片描述

8.实现memmove函数的功能:
(这个函数与memcpy函数最大的不同是它考虑了拷贝的两块空间重叠的情况)

分析图示:

这里写图片描述

第一种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>#include<string.h>void *my_memmove(void *dst,void *src,int count){    char *_dst = (char *)dst;    char *ret = _dst;    char *_src = (char *)src;    char *_dst_end = _dst + count - 1;    char *_src_end = _src + count - 1;    assert(dst);    assert(src);    while (count--)    {        if (_src < _dst && _dst < _src_end + 1)//切记:_dst < _src_end + 1(需要减至'\0'的后面)        {            *_dst_end-- = *_src_end--;        }        else        {            *_dst++ = *_src++;        }    }    return ret;}int main(){    char dst[34] = "hello";    int count  = strlen(dst) + 1;    my_memmove(dst+1,dst,count);    printf("%s \n",dst);    system("pause");    return 0;}

这里写图片描述

第二种方法:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<assert.h>void show(int *arr,int sz){    int i = 0;    for (i = 0; i < sz; i++)    {        printf("%d ",arr[i]);    }    printf("\n");}void *my_memmove(void *dst,void *src,int count){    char *pdst = (char *)dst;    char *psrc = (char *)src;    assert(dst);    assert(src);    assert(count > 0);    if (pdst > psrc && pdst < psrc + count)    {        while (count--)        {           *(pdst + count) = *(psrc + count);//注意:count一直在减1        }    }    else    {        while (count--)        {            *pdst++ = *psrc++;        }    }    return dst;}int main(){    int arr1[10] = {1,2,3,4,5,6,7,8,9};    int sz = sizeof(arr1);    my_memmove(arr1+1,arr1,sz);    show(arr1,sz/sizeof(int));    system("pause");    return 0;}

这里写图片描述

9.模拟实现memset函数:

调用memset函数后的结果:

这里写图片描述

模拟实现:

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>void show(int *arr,int sz){    int i = 0;    assert(arr);    for (i = 0; i < sz; i++)    {        printf("%x ",arr[i]);    }    printf("\n");}void *my_memset(void *dst,int c,int count){    assert(dst);    assert(count > 0);    while (count--)    {        *(char *)dst = 1;        dst = (char *)dst + 1;    }}int main(){    int arr[10];    show(arr,sizeof(arr)/sizeof(int));    my_memset(arr,1,sizeof(arr));    show(arr,sizeof(arr)/sizeof(int));    system("pause");    return 0;}
0 0