No.25 经典笔试题(二):模拟实现strcpy,strcat,strcmp,strstr,memcpy

直接上代码:

1.
//模拟实现strcpy
#include <stdio.h>
#include <assert.h>

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest ;
	assert(dest != NULL) ;
	assert(src != NULL) ;
	while(*src != '\0')
	{
		*dest = *src ;
		dest++ ;
		src++ ;
	}
	*dest = '\0' ;//手动地将最后的'\0'补上
	return ret ;
}

int main()
{
	char dest[1024] = "I am a" ;
	char src[1024] = "He is a student!" ;
	char* ret = NULL ;
	printf("----------模拟实现strcpy函数----------\n") ;
	printf("\n拷贝之前两个字符串分别为:\n") ;
	printf("%s\n", dest) ;
	printf("%s\n", src) ;
	ret = my_strcpy(dest, src) ;
	printf("\n拷贝之后字符串分别为:\n") ;
	printf("%s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

2.
//模拟实现strcat
#include <stdio.h>
#include <assert.h>

char* my_strcat(char* dest, const char* src)
{
	char* ret = dest ;//将目的字符串的起始位置先保存,等会要返回它的头指针
	//先找到dest的结束位置,再把src拷贝到dest中,记得在最后要加上'\0'
	assert(dest != NULL) ;
	assert(src != NULL) ;
	while(*dest != '\0')
	{
		dest++ ;
	}
	//此刻dest已经指向结束位置
	while(*src != '\0')
	{
		*dest = *src ;
		dest++ ;
		src++ ;
	}
	*dest = '\0' ; //记得在最后要加上'\0'结束标志
	return ret ;
}

int main()
{
	char dest[1024] = "I am a " ;
	char src[1024] = "student!" ;
	char* ret = NULL ;
	printf("----------模拟实现strcat函数----------\n") ;
	printf("\n拼接之前两个字符串分别为:\n") ;
	printf("%s\n", dest) ;
	printf("%s\n", src) ;
	ret = my_strcat(dest, src) ;
	printf("\n拼接之后字符串分别为:\n") ;
	printf("%s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

3.
//模拟实现strcmp函数

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

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

int main()
{
	char str1[1024] = "I am a student" ;
	char str2[1024] = "I am a student..." ;
	int ret = 0 ;
	printf("----------模拟实现strcmp函数----------\n") ;
	printf("\n比较之前两个字符串分别为:\n") ;
	printf("%s\n", str1) ;
	printf("%s\n", str2) ;
	ret = my_strcmp(str1, str2) ;
	printf("若返回-1,则str1 < str2\n") ;
	printf("若返回,则str1 > str2\n") ;
	printf("若返回,则str1 == str2\n") ;
	printf("\n比较之后结果为:\n") ;
	printf("%d\n", ret) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

4.
//模拟实现strstr函数

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




char* my_strstr(const char* str1, const char* str2)
{
	//在str1中尝试查找str2
	//例如,第一次,str1指向字符串起始位置,然后比较str1和str2
	char* cp = str1 ; //保存str1起始位置
    assert(str1 != '\0') ;
	assert(str2 != '\0') ;
	//若str2为空,则直接返回空
	if(*str2 == '\0')
	{
		return NULL ;
	}
	//若不为空,则进行查询
	while(*cp != '\0')
	{
		char* s1 = cp ;
		char* s2 = str2 ;
		while(*s1 != '\0' && *s2 != '\0' && *s1==*s2)
		{
			s1++ ;
			s2++ ;
		}

		//若s2先结束
		if(*s2 == '\0')
		{
			return str2 ;
		}
		//若s1先结束而s2还没结束,则返回空,例如在abcd 中查询bcde
		if(*s1 == '\0' && *s2 != '\0')
		{
			return NULL ;
		}

		cp++ ;
	}
	return NULL ;
}

int main()
{
	char str1[1024] = "hello world" ;
	char str2[1024] = " world hello" ;
	char* ret = NULL ;
	printf("----------模拟实现strstr函数----------\n") ;
	printf("\n匹配之前两个字符串分别为:\n") ;
	printf("str1 = %s\n", str1) ;
	printf("str2 = %s\n", str2) ;
	ret = my_strstr(str1, str2) ;
	printf("\n查询结果为: %s\n",ret) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

5.
//模拟实现memcpy函数
#include <stdio.h>
#include <assert.h>

void* my_memcpy(void* dest, const void* src, size_t num)
{
	void* ret = dest ;
	size_t i = 0 ;
	assert(dest != NULL ) ;
	assert(src != NULL) ;

	for(i = 0; i<num; i++)
	{
		//因为void* 不能直接解引用,所以需要强转成char*再解引用
		//此处的void*实现了泛型编程
		*(char*) dest = *(char*) src ;
		dest = (char*)dest + 1 ;
		src = (char*) src + 1 ;
	}

	return ret ;
}

int main()
{
	char src[1024] = "My name is Romeo" ;
	char dest[1024] = {0} ;
	printf("----------模拟实现memcpy函数----------\n") ;
	printf("\n处理之前两个字符串分别为:\n") ;
	printf("str1 = %s\n", dest) ;
	printf("str2 = %s\n", src) ;
	my_memcpy(dest, src, sizeof(src)) ;
	printf("\n处理之后str1: %s\n", dest) ;
	return 0 ;
}

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/studyhardi/article/details/84062485
今日推荐