C语言:考试最常考的8个函数的模拟实现(strcpy........)

1.模拟实现strcpy(字符串拷贝)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

 char * my_strcpy(char* dest, const char* src)
{ 
    assert(dest&&src);
    char* ret = dest;
    while (*dest++=*src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr[10] = { 0 };
    my_strcpy(arr, "abcde");
    printf("%s\n", arr);
    system("pause");
    return 0;
}

2.模拟实现strlen(字符串长度)

①常规方法:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int my_strlen(const char *str)
{
	assert(str != NULL);//断言
	int count = 0;
	while (*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

int main()
{
	char *p = "abcdef";
	int len = my_strlen(p);
	printf("len=%d\n", len);
	system("pause");
	return 0;
}

②递归
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen( const char *str)
{
	assert(str != NULL);
	if (*str != '\0')
	{
		return 1 + my_strlen(str + 1);
	}
	else
	{
		return 0;
	}
}
int main()
{
	char *p = "abcdef";
	int len = my_strlen(p);
	printf("len=%d\n", len);
	system("pause");
	return 0;
}
③指针方法

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strlen(const char *str)
{
	const char *ret = str;
	assert(str != NULL);
	while(*str++!='\0')
	{
		;
	}
	/*while (*str != '\0')
	{
		str++;
	}
	if (*str == '\0')
	{
		str++;
	}*/
	return str - ret-1 ;
}

int main()
{
	char *p = "abcdef";
	printf("len=%d\n", my_strlen(p));
	system("pause");
	return 0;
}

3.模拟实现strcat(字符串连接)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

char * my_strcat(char* dest, const char* src)
{
    assert(dest&&src);
    char* ret = dest;
    while (*dest)
    {
        dest++;
    }
    while (*dest++ = *src++)
    {
        ;
    }
    return ret;
}

int main()
{
    char arr[20] =  "wscis" ;
    my_strcat(arr, "apig");
    printf("%s\n", arr);
    system("pause");
    return 0;
}


4.模拟实现strstr  (子字符串在原字符串中第一次出现的位置)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

char* my_strstr(const char* str, const char* substr)
{
    assert(str&&substr);
    const char* s1 = str;
    const char* s2 = substr;
    const char* cur = str;
    while (*cur)
    {
        s1 = cur;
        s2 = substr;
        while (*s1 &&*s2 && (*s1 == *s2))//让while循环停下来的条件有三种,每一个都得考虑
        {
            s1++;
            s2++;
        }
        if (*s2 == '\0')
        {
            return (char*)cur;
        }
        if (*s1 == '\0')
        {
            return NULL;
        }
        cur++;
    }
    return NULL;
}


int main()
{
    char *p = "abbbcdef";
    char *q = "bbc";
   char *ret=my_strstr(p, q);
   if (ret != NULL)
   {
       printf("%s\n", ret);
   }
   else
   {
       printf("找不到\n");
   }
   system("pause");
   return 0;
}


5.模拟实现strchr(找字符串中某个字符第一次出现的位置)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

 char* my_strchr( const char* str,char c )
{
     assert(str != NULL);
    while (*str!= '\0')
    {
        if (*str == c)
        {
            return (char*)str;
        }
        str++;
    }
    return NULL;
}

int main()
{
    char *p = "abcdefc";
    printf("%s\n", my_strchr(p, 'c'));
    system("pause");
    return 0;
}

6.模拟实现strcmp(字符串连接)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int my_strcmp(const char* str1, const char*str2)
{
    assert(str1&&str2);
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    return *str1 - *str2;
        

}
int main()
{
    char *p1 = "abcde";
    char *p2 = "abcccdfg";
    int ret=my_strcmp(p1, p2);
    printf("%d\n",ret);
    system("pause");
    return 0;
}

7.模拟实现memcpy(内存拷贝)

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t sz)
{
    char* pdest = (char*)dest;
    char* psrc = (char*)src;
    assert(pdest&&psrc);
    unsigned i = 0;
    for (i = 0; i < sz;i++)
    {
        *pdest = *psrc;
        pdest++;
        psrc++;
    }
    return dest;
}
int main()
{
    char arr1[10] = { 0 };
    char arr2[] = "abcde";
    my_memcpy(arr1, arr2, 4*sizeof(arr2[0]));
    printf("%s\n", arr1);
    system("pause");
    return 0;
}

8.模拟实现memmove(内存移动)
 

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

void* my_memmove(void* dest, const void* src, size_t sz)
{
    void* ret = dest;
    assert(dest&&src);
    if (dest < src)//正着拷贝
    {
        while (sz--)
        {
        *(char*)dest = *(char*)src;
        dest = (char*)dest + 1;
        src = (char*)src + 1;
        }
    }
    else//从后向前拷贝
    {
        while (sz--)
        {
            *((char*)dest + sz) = *((char*)src + sz);
        }
    }
    return dest;
}
int main()
{

    int arr[] = {1,2,3,4,5,6,7,8};
    my_memmove(arr+2,arr,4*sizeof(arr[0]));
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42270373/article/details/81290500