No.25 經典筆試題(二):模擬實現strcpy,strcat,strcmp,strstr,memcpy
阿新 • • 發佈:2018-11-17
直接上程式碼:
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 ;
}
執行結果: