常用字符串函数具体实现以及注意事项
Posted 不倒翁*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用字符串函数具体实现以及注意事项相关的知识,希望对你有一定的参考价值。
文章目录
1.strlen函数实现及介绍
1.字符串已经 ‘\\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\\0’ 前面出现的字符个数(不包含 ‘\\0’ )。
2.参数指向的字符串必须要以 ‘\\0’ 结束。
3.注意函数的返回值为size_t,是无符号的( 易错 )
int my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
2.strcpy函数实现及介绍
char strcpy(chardes,char*src);
将src指向的字符串拷贝到des指向的字符串数组中去,结束符也一同进行拷贝,size参数也可以拷贝制定长度的字符串,建议des为字符数组,下面为实现strcpy函数的具体代码。
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* head = dest;
while (*dest++ = *src++)
{
;
}
return head;
}
3.strcmp函数实现及介绍
int strcmp(const char * str1,const char *str2);
按照ascii码来进行比较,并由函数返回值进行判断
返回0,字符串1等于字符串2,
大于0,字符串1大于字符串2,
小于0,字符串1小于字符串2,
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
int ret = 0;
while (*str1 && *str2)
{
ret = *(unsigned char*)str1 - *(unsigned char*)str2;
if (ret > 0)
{
return 1;
}
else if (ret < 0)
{
return -1;
}
else
{
str1++;
str2++;
}
}
if (*str1 == *str2)
{
return 0;
}
}
4.strcat函数实现及介绍
char * strcat(const *char str1,const *char str2);
将str2指向的字符串连接到str1指向的字符后面,同时会删除str1后面的’\\0’,返回的是str1指向字符串的首地址重点内容
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* head = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return head;
}
5.strstr函数实现及介绍
char* my_strstr(const char* str, const char* sub)
{
assert(str && sub);
char* cp = str;
char* substr = sub;
char* s1 = NULL;
if (*sub == '\\0')
return NULL;
while (*cp)
{
s1 = cp;
substr = sub;
while (*s1 && *substr && (*s1 == *substr))
{
s1++;
substr++;
}
if (*substr == '\\0')
return cp;
cp++;
}
}
6.memcpy函数实现及介绍
memcpy(void *des, void *src , size_t n);
1.函数memcpy从s的位置开始向后复制num个字节的数据到dest的内存位置。
2.这个函数在遇到 ‘\\0’ 的时候并不会停下来。
3.如果s和dest任何的重叠,复制的结果都是未定义的
void* my_memcpy(void* dest, const void* src, size_t count)
{
void* head = dest;
assert(src != NULL && dest != NULL);
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return head;
}
7.memove函数实现及介绍
void * memmove ( void * dest, const void * src, size_t num );
1.从src复制count字节的字符到dest. 如果src和dest出现重叠, 函数会自动处理.
2.和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
3.如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void my_memmove(void* dest, const void* src, size_t count)
{
void* ret = dest;
if (dest <= src || (char*)dest >= ((char*)src + count))
{
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
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 ret;
}
以上是关于常用字符串函数具体实现以及注意事项的主要内容,如果未能解决你的问题,请参考以下文章