直接上代码:
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 ;
}
运行结果: