strlen、strcmp、strcat、strcpy、memcpy基础函数的实现
最近实习+投简历+琐事弄得自己忙的不行不行的,终于今天可以开始记录一些东西了。。。
1.strlen函数的实现
1 int strlen(const char *str){ 2 assert(str!=NULL); 3 int len=0; 4 while(*(str++) != '\0'){ 5 len++; 6 } 7 return len; 8 }
2.strcmp函数的实现
int strcmp(const char *s, const char *p){ assert(s != NULL && p != NULL); int ret = 0; while(!(ret = *(unsigned char *)s - *(unsigned char *)p) && *s){ s++; p++; } if(ret > 0)return 1; if(ret < 0)return -1; return ret; }
3.strcat函数的实现
char *strcat(char *dest, const char * src){ assert(dest != NULL && src != NULL); char *addr = dest; while(*addr != '\0'){ addr++; } while((*addr++ = *src++) != '\0'); return dest; }
4.strcpy函数的实现
strcpy函数实现可以运用memcpy函数,原因就是memcpy函数实现的时候考虑到了内存重叠的情况,而strcpy函数的一般实现没有考虑到内存重叠的情况。
实现一:
char *strcpy(char *dest, const char *src){ assert(dest != NULL && src != NULL); char *addr = dest; while((*dest++ = *src++) != '\0'); return *addr; }
实现二:
char *strcpy(char *dest, const char *src){ assert(dest != NULL && src != NULL); char *addr = dest; memcpy(dest, src, strlen(src)+1); return *addr; }
5.memcpy函数的实现
memcpy函数实现的时候需要考虑内存重叠的情况。
void *memcpy(void *dest, const void *src, unsigned int count){ assert(dest != NULL && src != NULL); void *addr = dest; if(dest <= src || (char *)dest >= (char *)src+count){//这种情况不会发生问题,直接复制就好(画图看看吧!) while(count--){ *(char *)dest = *(char *)src; dest = (char *)dest+1; src = (cahr *)src+1; } }else{//这种情况是src后端的一部分与dest前段的一部分重合,一旦从头开始复制就会将src后端与dest重合的部分覆盖掉,导致信息丢失而出错。 dest = (char *)dest+count-1; src = (char *)src+count-1; while(count--){ *(char *)dest = *(char *)src; dest = (char *)dest-1; src = (char *)src-1; } } return addr; }