//strcpy//strncpy//strcat//strncat//strcmp//strncmp//memcpy//memmove
以上函数都是库函数,现在我来模拟实现他们的功能,其他的也不多说了,看代码吧!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char*dst,const char*src)
{
char* ret=dst;
assert(dst);
assert(src);
while(*dst)
{
*dst++ = *src++;
}
return ret;
}
char* my_strncpy(char*dst,const char*src,int n)
{
int i=0;
char* ret = dst;
assert(dst);
assert(src);
for ( i = 0; i < n; i++)
{
*dst++ = *src++;
}
return ret;
}
char* my_strcat(char *dst,const char*src)
{
int len=strlen(dst);
char *ret=dst;
assert(dst);
assert(src);
while(*(dst+len) =*src++)
{
len++;
}
return ret;
}
char *my_strncat(char*dst,const char*src,int n)
{
int len=strlen(dst);
char*ret=dst;
int i=0;
assert(dst);
assert(src);
for(i=0;i<n;i++)
{
*(dst+len)=*src++;
len++;
}
return ret;
}
int my_strcmp(const char*dst,const char*src)
{
assert(dst);
assert(src);
while(*dst !='\0' && *src !='\0')
{
if(*dst>*src)
{
return 1;
}
else if(*dst<*src)
{
return -1;
}
}
if(*dst=='\0' && *src !='\0')
{
return -1;
}
else if(*dst !='\0' && *src=='\0')
{
return 1;
}
return 0;
}
int my_strncmp(const char *dst,const char*src,int n)
{
int i=0;
assert(dst);
assert(src);
for(i=0;i<n;i++)
{
if(*dst<*src)
{
return -1;
}
else if(*dst>*src)
{
return 1;
}
}
return 0;
}
void*my_memcpy(void *dst,const void*src,int count)
{
void*ret=dst;
assert(dst);
assert(src);
while(count--)
{
*((char *)dst) = *((char *)src);
((char *)dst)++;
((char *)src)++;
}
*((char *)dst) = '\0';
return ret;
}
void *my_memmove(void *dst, void *src, size_t n)
{
void *ret = dst;
assert(dst);
assert(src);
if (dst <= src || (char *)dst >= ((char *)src + n))
{
while (n--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{
src = (char *)src + n - 1;
dst = (char *)dst + n - 1;
while (n--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return ret;
}
int main()
{
char str1[20]="victory";
char str2[20]="abcdefg";
int n=6;
char *p = (char *)my_memmove(str1 + 1, str1, strlen(str1) + 1);
printf("%s\n",p);
printf("%s\n",my_strcpy(str1,str2));
printf("%s\n",my_strncpy(str1,str2,n));
printf("%s\n",my_strcat(str1,str2));
printf("%s\n",my_strncat(str1,str2,n));
printf("%d\n",my_strcmp(str1,str2));
printf("%d\n",my_strncmp(str1,str2,n));
printf("%s\n",my_memcpy(str1,str2, n));
system("pause");
return 0;
}
写程序的时候遇到了几个小问题,现在写出来防止以后再出现:
1、我用的是VS2008写的,其中运行的时候会出现“变量未定义”,那么就是定义变量的时候没有放在最上边。例如写第一个程序的时候,先写assert(dst);等再定义的char ret;那么,程序就会报错。
2、如果编译链接都没有问题,那就是逻辑问题了,自己调试吧。
3、写很长的程序最容易出错,如果运行时报错:“无法解析的外部符号 _my_memncpy,该符号在函数 _main 中被引用”,那就是函数名称写的不一致,注意细节。
……