- 求字符串长度(strlen)
size_t strlen(const char *str)
函数返回字符串中’\0’之前的字符个数(不包括’\0’),参数指向的字符串必须以’\0’结束
模拟实现(3种方法)
int my_strlen1(const char *str)//递归
{
assert(str);
if (*str == '\0')
return 0;
else
return 1 + my_strlen1(str + 1);
}
int my_strlen2(const char *str)//计数器方式
{
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int my_strlen3(const char *str)//指针方式
{
assert(str);
const char *start = str;
while (*str != '\0')
{
str++;
}
return str - start;
}
- strcpy函数
char * strcpy(char* dest,const char* source)
源字符串必须以’\0’结束,将源字符串的’\0’拷贝到目标空间
模拟实现
char* my_strcpy(char* dest, const char* src)
{
assert(dest);
assert(src);
char *pdest = dest;
char *psrc = src;
while (*pdest++ = *psrc++)
{
;
}
return dest;
}
- strcat函数
实现字符串的追加,源字符串必须以’\0’结束
char* my_strcat(char* dest, const char* src)
{
assert(dest);
assert(src);
char *pdest = dest;
char *psrc = src;
while (*pdest)
{
pdest++;
}
while (*pdest++ = *psrc++)
{
;
}
*pdest='\0';
return dest;
}
- strcmp函数
实现两个字符串的比较,第一个字符串大于第二个字符串,返回大于0的数字;第一个字符串等于第二个字符串,返回0;第一个字符串小于第二个字符串,返回小于0的数字。
模拟实现
int my_strcmp(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
while (*str1 == *str2)
{
if (str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
- strncpy函数
实现拷贝n个字符从源字符串到目标空间,如果源字符串长度小于n,则拷贝完之后在目标的后面追加0,直到n个。
模拟实现
char* my_strncpy(char* dest, const char* src, size_t n)
{
assert(dest);
assert(src);
char *pdest = dest;
const char *psrc = src;
while (n--)
{
if (*psrc != '\0')
{
*pdest = *psrc;
pdest++;
psrc++;
}
else
{
*pdest = '\0';
return dest;
}
}
return dest;
}
- strncat函数
char* strncat(char *dest,const char *src,size_t n)
追加n个字符
模拟实现
char* my_strncat(char* dest, const char* src,size_t n)
{
assert(dest);
assert(src);
char *pdest = dest;
char *psrc = src;
while (*pdest)
{
pdest++;
}
while (n--)
{
*pdest++ = *psrc++;
}
*pdest = '\0';
return dest;
}
- strncmp函数
int strncmp(const char* str1,const char* str2,size_t n)
比较到出现两个字符不一样或者一个字符串结束或者n个字符全部比较完
模拟实现
int my_strncmp(const char* str1, const char* str2,size_t n)
{
assert(str1);
assert(str2);
while (n--)
{
if(*str1 == *str2)
{
str1++;
str2++;
}
else
return *str1 - *str2;
}
}
- strchr函数
在一个字符串找一个字符
模拟实现
char* my_strchr(const char* str, char k)
{
assert(str);
while (*str != '\0'&&*str != k)
{
str++;
}
if (*str == k)
return str;
return NULL;
}
- strstr函数
在字符串中找指定字符串
char* strstr(const char *str1,const char *str2)
模拟实现
char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
const char *s1 = str1;
const char* s2 = str2;
char* cur = str1;
while (*cur)
{
s1 = cur;
s2 = str2;
while (s1&&s2&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return (char*)cur;
cur++;
}
return NULL;
}
- strtok
用法
char arr[] = "kkk@qq.com";
char buf[30] = { 0 };
char* ret = NULL;
char* sep = "@.";
strcpy(buf, arr);
for (ret = strtok(buf, sep); ret != NULL;ret=strtok(NULL,sep))
{
printf("%s\n", ret);
}
/*printf("%s\n", strtok(buf, "@."));
printf("%s\n", strtok(NULL, "@."));
printf("%s\n", strtok(NULL, "@."));*/
输出结果为kkk,qq,com
- memcpy函数(内存拷贝)
void* memcpy(void* dest,const void* src,size_t n)
从源的位置开始向后复制n个字节的数据到目标空间
在遇到’\0’时不会停下来,如果源与目标空间有任何的重叠,复制的结果都是未定义的。
模拟实现
void* my_memcpy(void* dest, const void* src, size_t n)
{
assert(dest);
assert(src);
void* pdest = dest;
while (n--)
{
*(char*)pdest = *(char*)src;
pdest=((char*)pdest)+1;
src=((char*)src)+1;
}
return dest;
}
- memmove函数
与memcpy的区别在于memmove函数处理的源内存块和目标内存块是可以重叠的
模拟实现
void* my_memmove(void* dest, const void* src, size_t n)
{
assert(dest);
assert(src);
char* pdest = dest;
if (pdest < src)//从前往后
{
while (n--)
{
*(char*)pdest = *(char*)src;
pdest=((char*)pdest)+1;
src=((char*)src)+1;
}
return dest;
}
else//从后往前
{
while (n--)
{
*((char*)pdest + n) = *((char*)src + n);
}
return dest;
}
}
- memcmp函数
int memcmp(const void* s1,const void* s2,size_t n)
模拟实现
int my_memcmp(void* str1,void* str2,size_t n)
{
assert(str1);
assert(str2);
char* dest=(char*)str1;
char* src=(char*)str2;
while(n && *dest==*src)
{
n--;
dest++;
src++;
}
if(n==0)
return 0;
return *dest-*src;
}
- memset函数
void* my_memset(void* src, int val, size_t count)
{
assert(src != NULL);
void* ret = src;
while (count--)
{
*(char*)src = (char)val;
src = (char*)src + 1;
}
return ret;
}