1. 程式人生 > >No.25 經典筆試題(二):模擬實現strcpy,strcat,strcmp,strstr,memcpy

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 ;
}

執行結果:
在這裡插入圖片描述