手写函数原型
1、memcpy函数
void *memcpy(void *dst, const void *src, int len) { if(NULL == dst || NULL == src)
{ return NULL; } void *ret = dst; if(dst <= src || (char *)dst >= (char *)src + len)
{ //没有内存重叠,从低地址开始复制 while(len--)
{ *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } }
else
{ //有内存重叠,从高地址开始复制 src = (char *)src + len - 1; dst = (char *)dst + len - 1; while(len--)
{ *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return ret; }
2、memmove函数
链接:https://www.nowcoder.com/questionTerminal/9602083ec8d749999d86adf8a725b4f7 来源:牛客网 在linux中,memcpy是不考虑内存重叠的隐患问题的,即方法一; memcpy的改进版,考虑上内存重叠问题,就是memmove,即方法二。 方法一: void *memcpy(void *dest, const void *src, size_t n) { char *tmp = (char *)dest; char *s = (char *)src; while (n--) *tmp++ = *s++; return dest; } 方法二: void *memmove(void *dest, const void *src, size_t n) { char *tmp, *s; if (dest <= src) //没有内存重叠,从低地址开始复制 { tmp = (char *) dest; s = (char *) src; while (n--) *tmp++ = *s++; } else //有内存重叠,从高地址开始复制 { tmp = (char *) dest + n; s = (char *) src + n; while (n--) *--tmp = *--s; } return dest; }
3、strcpy函数
char *strcpy(char *strDest, const char *strSrc)
{ assert((strDest!=NULL) && (strSrc!=NULL));//首先判断两个指针指向的地址不为空 char *address = strDest;//然后声明一个指针,将目的指针的地址赋值给它 //将原指针的值挨个赋值给目的指针,直到遇到'\0' while((*strDset++ = *strSrc++) != '\0'); return address;//返回复制的指针 }
4、strcat函数
char * strcat (char * dst, const char * src) { char * tmpdst = dst; while( *tmpdst ) tmpdest++; /* find end of dst */ while( *tmpdst++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ }
//那么为什么要返回char*类型呢?
答:是为了方便赋值给其他变量
//再问,还有其他办法能实现s1连接s2字符串吗?
答:可以,如下:
void Mystrcat (char dst[ ],char src[]) { int i=0,j=0; //数组下标初始化为0 while (dst[i] !='\0’) i++; while (src[j] !=’\0’) { dst[i]=src[j]; i++; j++; } dst[i]=’\0’; //在字符串dst的末尾添加一个字符串结束标志 }
5、atoi函数
int myatoi(char *str) { int ret = 0, cur; int flag = 1; assert(str != NULL); while (*str == ' ')
{ str++; } if (*str == '-' || *str == '+')
{ if (*str == '-')
{ flag = -1; } str++; } while (*str >= '0' && *str <= '9')
{ cur = *str - '0'; if (flag == 1)
{ if (ret > INT_MAX / 10 || (ret == INT_MAX / 10 && cur >= INT_MAX % 10)) return INT_MAX; } else
{ if (-ret < INT_MIN / 10 || (-ret == INT_MIN / 10 && -cur <= INT_MIN % 10)) return INT_MIN; } ret = ret * 10 + cur; str++; } return ret * flag; } ———————————————— #define INT_MAX 2147483647 #define INT_MIN (-INT_MAX - 1) 二者位于<limit.h>之中