这篇文章主要为大家展示了“如何模拟实现str系列库函数”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何模拟实现str系列库函数”这篇文章吧。
strlen #include <string.h> size_t strlen( char *str ); |
功能:函数返回字符串str 的长度( 即空值结束符之前字符数目)。
非递归实现
size_t my_strlen(const char* src)
{
assert(src);
size_t len = 0;
while (*src++ != '\0')
++len;
return len;
}
递归实现
int my_strlen2(const char* strDest) //递归求字符串长度
{
assert(strDest);
if ('\0' == *strDest)
return 0;
else
return (1 + my_strlen(++strDest));
}
strcpy #include <string.h> char *strcpy( char *to, const char *from ); |
功能:复制字符串from 中的字符到字符串to,包括空值结束符。返回值为指针to。
不考虑内存重叠
char* my_strcpy(char* dst, const char* src)
{
assert(dst && src);
char* pdst = dst;
while ((*pdst++ = *src++) != '\0');
return dst;
}
考虑内存重叠
char *my_strcpy(char *dst,const char *src)
{
assert(dst && src);
char *ret = dst;
my_memcpy(dst,src,strlen(src)+1);
return ret;
}
其中my_memcpy实现如下:
void * my_memcpy(void *dst, const void *src, size_t count)
{
assert(dst && src);
char* pdst = (char*)dst;
char* psrc = (char*)src;
int n = count;
if (pdst > psrc && pdst < (psrc + count)) //重叠
{
for (size_t i = n - 1; i != -1; --i)
pdst[i] = psrc[i];
}
else
{
for (size_t i = 0; i < n; ++i)
pdst[i] = psrc[i];
}
return dst;
}
strncpy #include <string.h> char *strncpy( char *to, const char *from, size_t count ); |
功能:将字符串from 中至多count个字符复制到字符串to中。如果字符串from 的长度小于count,其余部分用'\0'填补。返回处理完成的字符串。
char* my_strncpy(char* dst, const char* src, size_t n)
{
assert(dst && str);
char* pdst = dst;
const char* psrc = src;
while (n && (*pdst++ = *psrc ++) != '\0')
{
--n;
}
if (n) //如果n==0 则下面会死循环
{
while (n--)
{
*pdst++ = '\0';
}
}
return dst;
}
strstr #include <string.h> char *strstr( const char *str1, const char *str2 ); |
功能:函数返回一个指针,它指向字符串str2 首次出现于字符串str1中的位置,如果没有找到,返回NULL。
char* my_strstr(const char* src, const char* sub)
{
assert(src && sub);
int sublen = strlen(sub);
char* srctmp = NULL;
char* subtmp = NULL;
while (strlen(src) >= sublen) //strlen(src)在不断更新,可以提前结束循环
{
srctmp = (char*)src;
subtmp = (char*)sub;
while (*srctmp == *subtmp)
{
if (*subtmp == '\0')
return (char*)src;
++srctmp;
++subtmp;
}
if (*subtmp == '\0')
return (char*)src;
++src;
}
return NULL;
}
strcat #include <string.h> char *strcat( char *str1, const char *str2 ); |
功能:函数将字符串str2 连接到str1的末端,并返回指针str1.
char* my_strcat(char* dst, const char* str)
{
assert(dst && str);
char* pdst = dst;
while (*pdst != '\0') //注意这里不能为 *pdst++ != '\0' 这样会多加一次!
++pdst;
while (*str != '\0')
*pdst++ = *str++;
*pdst = '\0';
return dst;
}
strncat #include <string.h> char *strncat( char *str1, const char *str2, size_t count ); |
功能:将字符串from 中至多count个字符连接到字符串to中,追加空值结束符。返回处理完成的字符串。
char* my_strncat(char *dst, const char *str, size_t n)
{
assert(dst && str);
char* pdst = dst;
while (*pdst != '\0')
++pdst;
while (n && (*pdst = *str) != '\0')
{
--n;
++pdst; //最好这样做,不要放在while里面
++str;
}
*pdst = '\0';
return dst;
}
strcmp #include <string.h> int strcmp( const char *str1, const char *str2 ); |
功能:比较字符串str1 and str2, 返回值如下:
返回值 | 解释 |
less than 0 | str1 is less than str2 |
equal to 0 | str1 is equal to str2 |
greater than 0 | str1 is greater than str2 |
int my_strcmp(const char *str1, const char *str2)
{
assert(str1 && str2);
const char* pstr1 = str1;
const char* pstr2 = str2;
while (*pstr1 && *pstr2 && (*pstr1 == *pstr2))
{
++pstr1;
++pstr2;
}
return *pstr1 - *pstr2;
}
strncmp #include <string.h> int strncmp( const char *str1, const char *str2, size_t count ); |
功能:比较字符串str1 和 str2中至多count个字符。返回值如下:
返回值 | 解释 |
less than 0 | str1 is less than str2 |
equal to 0 | str1 is equal to str2 |
greater than 0 | str1 is greater than str2 |
如果参数中任一字符串长度小于count, 那么当比较到第一个空值结束符时,就结束处理。
int my_strncmp(const char *str1, const char *str2, size_t n)
{
assert(str1 && str2 && n > 0);
const char* pstr1 = str1;
const char* pstr2 = str2;
while (--n && *pstr1 && *pstr2 && (*pstr1 == *pstr2))
{
++pstr1;
++pstr2;
}
return *pstr1 - *pstr2;
}
以上是“如何模拟实现str系列库函数”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。