已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count) 其中dst是目的指针,src是源指针。不调用c/c++的memcpy库函数,请编写memcpy。
/*
已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count)
其中dst是目的指针,src是源指针。不调用c/c++的memcpy库函数,请编写memcpy。
2013-10-17
By Jackbase
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* memcpy(void *dst,const void *src,size_t count)
{
//安全检查
assert((dst!=NULL)&&(src!=NULL));
unsigned char *pdst=(unsigned char *)dst;
const unsigned char *psrc=(const unsigned char *)src;
//防止内存重复
assert(!(psrc<=pdst&&pdst<psrc+count));
assert(!(pdst<=psrc&&psrc<pdst+count));
while(count--)
{
*pdst=*psrc;
pdst++;
psrc++;
}
//memcpy是内存操作函数,非字符串操作函数
/*
*pdst='\0'; //字符串末尾加上'\0'
*/
return dst;
}
void main()
{
char* src="12345";
char* dst=new char[]; //动态分配内存
memcpy(dst,src,1);
printf("%s\n",dst);
}
2013-10-17 20:34补充:介于网友的提问‘\0’不需要加入,不加的话其实有乱码出现。
2013-10-17 22:12 补充:*pdst='\0';确实应该去掉,因为memcpy是内存操作函数,我误解成了strcpy,是在惭愧啊,十分感谢hellosijian指正。
自己动手写C语言库函数strcpy和strlen
/*
自己动手写C语言库函数strcpy
2013-10-17
By Jackbase
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t strlen(const char* src)
{
assert(src!=NULL);
int len=0;
while((*src++)!='\0')
{
len++;
}
return len;
}
char* strcpy(char* dst, const char*src)
{
//安全检查
assert((dst!=NULL)&&(src!=NULL));
char* pdst=dst;
while((*dst++=*src++)!='\0');
return pdst;
}
void main()
{
char *src="12345";
char *dst=new char[];
strcpy(dst,src);
printf("%s\n%d\n",dst,strlen(dst));
}
写一个函数,实现两个字符串的比较。即实现strcmp函数,str_1=str_2时返回0,str_1!=str_2时返回二者第一个不同字符的ASCII值。
/*
写一个函数,实现两个字符串的比较。即实现strcmp函数,str_1=str_2时返回0,str_1!=str_2时返回二者第一个不同字符的ASCII值。
2013-10-17
By Jackbase
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>
int strcmp(char* src_1, char* src_2)
{
int i=0; //i为中间变量
//安全检查
assert((src_1!=NULL)&&(src_2!=NULL));
while((*(src_1+i)==*(src_2+i))&&*(src_1+i++));
return (*(src_1+i)-*(src_2+i));
}
void main()
{
char* a="add";
char* b="ad";
printf("%d\n",strcmp(a,b));
}
注:上述代码仅供参考。