C语言库函数实现练习
1.模拟实现strcpy
strcpy是字符串复制函数,把从src(源字符串指针)地址开始且含有’\0’结束符的字符串复制到以dest(目的字符串指针)开始的地址空间。
注意:在进行复制时是连字符串结束标识符‘\0’一并复制。
只能拷贝字符串。
#include<stdio.h>
#include<assert.h>
char *my_strcpy(char *dst, const char *src)
{
char *start = dst;
assert(dst != NULL);
assert(src != NULL);
while (*dst++ = *(char*)src++)
{
;
}
return start; //返回起始地址
}
int main()
{
char arr1[20] = "Helloween";
char arr2[] = "Hello";
char *p = my_strcpy(arr1, arr2);
printf("%s\n", p);
return 0;
}
2.模拟实现strcat
strcat是用于字符串连接的函数,会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的字符串的尾部再增加一个 NULL。
注意:dest 与 src 所指的内存空间是不能重叠的,并且dest 要有足够的空间来容纳要复制的字符串。
#include<stdio.h>
#include<assert.h>
char *my_strncat(char *dst, const char *src, size_t n)
{
char *start = dst;
assert(dst != NULL);
assert(src != NULL);
while (*dst)
{
dst++;
}
while (n--)
{
*dst++ = *(char*)src++;
}
return start;
}
int main()
{
char arr1[60] = "Hello, ";
char arr2[] = "world";
char *p = my_strncat(arr1, arr2, 5);
printf("%s\n", p);
return 0;
}
3.模拟实现strstr
strstr是从字符串str1中查找是否有字符串str2函数。如果str2是str1的子串,确定子串在str1中第一次出现的位置,返回这个位置的地址。
如果不是子串,返回NULL。
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
char * my_strstr(char * dest, char * src)
{
char *p = dest;
char *s1 = p;
char *s2 = src;
assert(dest);
assert(src);
while (*s1)
{
s1 = p;
s2 = src;
while ((*s1!='\0')&&(*s2 != '\0'))
{
if (*s1++ == *s2++)
{
;
}
else
{
p++;
break;
}
}
if (*s2 == '\0')
{
return p;
}
}
}
int main()
{
char *str1 = "hellow,world";
char *str2 = "world";
char *ret = my_strstr(str1, str2);
printf("%s\n", ret);
system("pause");
return 0;
}
4.模拟实现strchr
strchr是查找字符串s中首次出现某个字符的位置。返回某字符首次出现的位置,如果字符不存在,返回NULL。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char*my_strchr(const char *string,char c)
{
int i = 0;
assert(string);
while (*string!=NULL)
{
if (*string == c)
{
return string;
}
else
{
string++;
}
}
return NULL;
}
int main()
{
char*arr = "hellow";
char p = 'o';
char *ret = my_strchr(arr, p);
printf("%s", ret);
return 0;
}
5.模拟实现strcmp
strcmp是比较两个字符串,若str1==str2,返回0。若str1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char *s1, const char *s2)
{
assert(s1);
assert(s2);
while ((*s1 == *s2) && (*s1 != '\0'))
{
s1++;
s2++;
}
return *s1 - *s2;
}
int main()
{
int ret = 0;
char str1[40] = "helloworld";
char str2[20] = "world";
ret = my_strcmp(str1, str2);
printf("%d\n", ret);
system("pause");
return 0;
}
6.模拟实现memcpy
memcpy是内存拷贝函数,是将N个字节的源内存地址的内容拷贝到目标内存地址中。
拷贝时会有一个变量size控制。memcpy和strcpy不同,它可以拷贝任意内容。而且strcpy复制时不指定长度,有可能会溢出。
注意!使用memcpy时要保证源和目标的内存区域不能重叠。
#include <stdio.h>
#include<stdlib.h>
void * my_memcpy(void * dst, const void * src, int count)
{
void *ret = dst;
while (count--)
{
*(char *)dst = *(char *)src;
dst=(char *)dst+1;
src=(char *)src+1;
}
return ret;
}
int main()
{
char p[] = "hellow";
char *a = "hi";
my_memcpy(p, a, 2);
printf("%s\n", p);
return 0;
}
memmove也是内存拷贝函数,和memcpy的作用是一样的,区别是,当内存发生局部重叠的时候memmove
可以保证拷贝结果正确,memcpy不能保证结果正确。
这种情况,不存在内存重叠,memcpy和memmove都可以保证结果正确。
这种情况下,拷贝的内容已经被覆盖,用memmove可以保证结果正确。
7.模拟实现memmove
#include <stdio.h>
#include <assert.h>
void * memmove(void * dst, const void * src, int count)
{
void * ret = dst;
assert(dst);
assert(src);
if (dst <= src || (char *)dst >= ((char *)src + count))
{
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}
int main()
{
char p[] = "hello!";
char *q = "world";
memmove(p, q,strlen(q)+1 );
printf("%s\n", p);
return 0;
}