手撕代码
一向是笔试面试必不可少的环节
算法、C库、操作系统
…
实现C语言库函数我们在课上也经常会给大家写,但是都不够全面。所以今天就给大家总结了一下。
常见C库函数的实现代码奉上
01
memcpy
函数原型
void *memcpy(void *dest, const void *src, size_t n);
返回值
返回指向dest的指针。
void *memcpy(void *dest, const void *src, size_t n)
{
if (NULL == dest || NULL == src)
{
return NULL;
}
char *dest_t = (char *)dest; //转换成字符型一个个复制拷贝,由于函数拷贝的过程是一个字节一个字节的拷贝的,所以实际操作的时候要把void*强制转化为char*,
char *src_f = (char *)src; //这样在指针加的时候才会保证每次加一个字节
while (n-- > 0)
{
*(dest_t++) = *(src_f++);
}
return dest; //void* 一定要返回一个值(指针),这个和void不太一样!函数返回指向dest的指针
}
02
strcpy
函数原型
char *strcpy(char *dest, const char *src);
函数返回值
返回指向字符串的指针dest。
char* strcpy(char *dest, const char *src)
{
if (dest == NULL || src == NULL)
return NULL;
char *res = dest; //保存原始dst的首地址
while ((*dest++ = *src++) != '\0');
return res;
}
03
strcat
函数原型
char *strcat(char *dest, const char *src);
函数返回值
返回指向结果字符串的指针dest。
char *strcat(char *dest, const char *src)
{
if (NULL == dest || NULL == src)
return NULL;
char *head = dest;
//dest指针移动到字符串末尾
while (*dest != '\0')
while ((*dest++ = *src++) != '\0');
return head;
}
04
strcmp
函数原型
int strcmp(const char *s1, const char *s2);
函数返回值
如果s1小于s2,返回值小于0;如果s1等于s2,返回值等于0;如果s1大于s2,返回值大于0。
int strcmp(const char *str1, const char *str2)
{
assert((str1 != NULL) && (str2 != NULL));
while ((*str1 != '\0') && (*str2 != '\0'))
{
if (*str1 == *str2)
{
str1++;
str2++;
}
else
{
if (*str1 > *str2)
return 1;
else
return -1;
}
}
if (*str1 == '\0' && *str2 == '\0')
return 0;
else if (*str1 == '\0' && *str2 != '\0')
return -1;
else if (*str1 != '\0' && *str2 == '\0')
return 1;
}
05
strlen
函数原型
size_t strlen(const char *s);
函数返回值
返回字符串的长度(字节)。
size_t strlen(const char *str)
{
assert(str);
int length = 0;
while(*str++ != '\0')
{
length++;
}
return length;
}
06
strstr
函数原型
char *strstr(const char *haystack, const char *needle);
函数返回值
返回子串的起始地址,如果子串不存在,返回空。
char *strstr(const char *haystack, const char *needle)
{
if (haystack == NULL || needle == NULL)
return NULL;
char *temp = haystack;
char *res = needle;
while (*haystack != '\0')
{
temp = haystack;
res = needle;
while (*temp == *res)
{
temp++;
res++;
}
if (*res == '\0')
return haystack;
haystack++;
}
return NULL;
}
07
memset
函数原型
void *memset(void *s, int c, size_t n);
函数返回值
返回内存的地址。
void *memset(void *s, int c, size_t n)
{
void *ret = s;
while(n--)
{
*(char *)s = (char)c;
s = (char *)s + 1; //移动一个字节
}
return ret;
}
08
atoi
函数原型
int atoi(const char *nptr);
函数返回值
转换后的数值。
int isspace(int x)
{
if (x == ' ' || x == '\t' || x == '\n' || x =='\f' || x =='\b' || x == '\r')
return 1;
else
return 0;
}
int isdigit(int x)
{
if (x <= '9' && x >= '0')
return 1;
else
return 0;
}
int atoi(const char *nptr)
{
int c; /*当前字符*/
int total; /*总计字节数*/
int sign; /*正数or负数*/
/*跳过开头的空格*/
while (isspace((int)(unsigned char)*nptr))
++nptr;
c = (int)(unsigned char)*nptr++;
sign = c; /*保存符号*/
if (c == '-' || c == '+')
c = (int)(unsigned char)*nptr++; /* skip sign */
total = 0;
while (isdigit(c))
{
total = 10 * total + (c - '0'); /*求和*/
c = (int)(unsigned char)*nptr++; /*获取下一个字符*/
}
if (sign == '-')
return -total;
else
return total;
}
09
strchr
函数原型
char *strchr(const char *s, int c);
函数返回值
返回匹配到的字符的地址,如果不存在返回空。
char *strchr(const char *s, int c)
{
if (NULL == s)
{
return NULL;
}
while (*s != '\0')
{
if (*dst == (char)c)
{
return dst;
}
s++;
}
return NULL;
}
10
strdup
函数原型
char *strdup(const char *s);
函数返回值
返回被复制字符串的地址。
char *my_strdup(char *src)
{
if(NULL == src)
{
return NULL;
}
char *p_src = NULL;
p_src = src ;
int count = 0 ;
while(*p_src != '\0')
{
count++;
p_src++;
}
char * new_addr = (char *)malloc(sizeof(char)*(count+1));
p_src = src;
while(*p_src != '\0')
{
*new_addr++ = *p_src++;
}
*new_addr = '\0';
return (new_addr -(count));
}
更多精彩视频、文章,请关注微信公众号 学益得智能硬件 !