1. strcpy函数:'\0'也拷贝,然后结束
- //自定义
- #include <stdio.h>
- char* strcpy(char*dest,const char *src)
- {
- char* d=dest;
- while(*d++=*src++);
- return dest;
- }
- int main(void)
- {
- char str[20]="aaaaaaaaaaaaaaa";
- char *p="worlddsfg";
- strcpy(str,p);
- printf("%s\n",str);
- return 0;
- }
linux内核中的lib/string.c文件中的实现方法:
- char *strcpy(char *dest, const char *src)
- {
- char *tmp = dest;
- while ((*dest++ = *src++) != '\0')
- /* nothing */;
- return tmp;
- }
2. memcpy实现
- #include <stdio.h>
- void* mymemcpy(void* dest,const void* src,size_t size)
- {
- if(dest==NULL || src==NULL)
- return (void*)0;
- if((char*)dest==(char*)src)
- return dest;
- char* d=(char*)dest;
- const char* s=(char*)src;
- while(size--)
- *d++=*s++;
- return dest;
- }
- int main(void)
- {
- char str[20]="hello";
- char *p="";
- mymemcpy(str,p,0);
- printf("%s\n",str);
- return 0;
- }
- //或使用
- void* mymemcpy(void* dest,const void* src,size_t size)
- {
- assert((src!=NULL)&&(dest!=NULL));
- char* d=(char*)dest;
- const char* s=(char*)src;
- while(size--)
- *d++=*s++;
- return dest;
- }
一般出题目让你实现memcpy,个人理解,其意图至少有以下几点:
1.写任何程序都能反映出你的代码风格。
2.考查你是否注意到,要拷贝的源,即const void* src,应该是用const的,避免有意或无意的修改。
3.指针的类型转化问题,原始参数应该是void *的,你具体操作的时候,应该是转化为某种具体的类型,此处用char比较适合。
4.注意要判断源src是否和dest重复,如果重复,直接返回或返回错误。
3. memmove实现
- #include <stdio.h>
- void* mymemmove(void* dest,const void* src,size_t size)
- {
- if(size==0)
- return (void*)0;
- if(dest==NULL || src==NULL)
- return (void*)0;
- char *d=(char*)dest;
- const char *s=(char*)src;
- if(d<=s || d>=s+size)//检查是否有重叠问题
- {
- while(size--)//正向拷贝
- *d++=*s++;
- }
- else //反向拷贝
- {
- while(--size >= 0) //此处有bug
- {
- *(d+size)=*(s+size);
- printf("*%s*%d*%u\n",src,size,size);
- }
- }
- return dest;
- }
- int main(void)
- {
- char str[20]="hellohui";
- char *p="worldhui";
- mymemmove(str+2,str,3);
- printf("%s\n",str);
- return 0;
- }
以上程序有bug,当反向拷贝时,执行到while(--size>=0) 处会出现无限循环,因为size为size_t类型,即typedef unsigned int size; 所以size永远是大于等于0,则while一直循环。
错误结果为:
从%u的输出可看出都为大于0,所以不会退出循环。
修改后为:
- #include <stdio.h>
- void* mymemmove(void* dest,const void* src,size_t size)
- {
- if(size==0)
- return (void*)0;
- if(dest==NULL || src==NULL)
- return (void*)0;
- char *d=(char*)dest;
- const char *s=(char*)src;
- if(d<=s || d>=s+size)//检查是否有重叠问题
- {
- while(size--)//正向拷贝
- *d++=*s++;
- }
- else //反向拷贝
- {
- d+=size-1;
- s+=size-1;
- while(size--) //修改后
- *d--=*s--;
- }
- return dest;
- }
- int main(void)
- {
- char str[20]="hellohui";
- char *p="worldhui";
- mymemmove(str+2,str,3);
- printf("%s\n",str);
- return 0;
- }
转载于:https://blog.51cto.com/liangbing8612/701723