直接上代碼:
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 ;
}
運行結果: