今天我们来补充 实现一些string.h库中的字符串函数
实现strchr
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
char *my_strchr(const char* str, int c )
{
char* ret = (char*)str;
while(*ret)
{
if(*ret == c)
return ret;
else
ret++;
}
return NULL;
}
int main()
{
char str[1025] = "my name is lili";
char *p = my_strchr(str, 's');
puts(p);
return 0;
}
实现strcmp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int my_strcmp(const char *str1, const char *str2)
{
while(*str2 && *str1)
{
if(*str1 == *str2)
{
str1++;
str2++;
}
else
break;
}
if((unsigned char)*str1 > (unsigned char)*str2)
return 1;
else if((unsigned char)*str1 < (unsigned char)*str2)
return -1;
return 0;
}
int main()
{
char str1[10] = "abcd";
char str2[10] = "efgh";
printf("%d\n",my_strcmp(str1, "abcde"));
printf("%d\n",my_strcmp(str2, str1));
printf("%d\n",my_strcmp(str1, "abcd"));
return 0;
}
实现strstr
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
char* my_strstr(const char* p1, const char* p2)
{
while(*p1)
{
char* r1 =(char*)p1;
char* r2 =(char*)p2;
if(*p1 == *p2)
{
while(*p2)
{
p1++;
p2++;
if((*p1 != *p2)&&(*p2 != '\0'))
{
p2 = r2;
break;
}
else if(*p2 == '\0')
return r1;
}
}
p1++;
}
return NULL;
}
int main()
{
char a1[1025] = "my name is lili";
char a2[1025] = "name";
char *pch = my_strstr(a1, a2);
printf("%s\n",pch);
return 0;
}
实现memcpy
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void* my_memcpy(void * dst, void * src, size_t count)
{
void * ret = dst;
while(count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}
int main()
{
char str1[20] = "my name is lili";
char str2[20] = {0};
my_memcpy(str2, str1, 10);
printf("%s\n",str2);
return 0;
}
实现memmove
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
void* my_memmove(void* dst,const void* src,size_t count)
{
void* ret = dst;
//dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容
if (dst <= src || (char*)dst >= ((char*)src + count))
{
//从前往后复制,则不会出现覆盖src中没有复制的内容
while(count--)
{
*(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制
dst = (char*)dst + 1; //移动一个字节
src = (char*)src + 1;
}
}
else
{
//从后往前复制,则不会出现覆盖src中没有复制的内容
dst = (char*)dst + count - 1;//移动到末尾
src = (char*)src + count - 1;
while(count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst - 1; //移动一个字节
src = (char*)src - 1;
}
}
//返回dst的头指针,还方便左值操作。
//如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);
return ret;
}
int main()
{
char str1[1024] = "abcdefghijk";
char str2[1024] = "abcdefghijk";
memmove(str1, str1+3, 8);//defghijkijk
my_memmove(str2, str2+3, 8);//defghijkijk
puts(str1);
puts(str2);
return 0;
}