您的位置:首页 > 编程语言 > C语言/C++

常见字符串函数的模拟实现(二)(c语言)

2017-11-21 20:24 417 查看
模拟实现 :strncpy ,strncat ,strncmp ,strchr ,strrstr

1.strncpy函数的功能是拷贝一个字符串中的前n个字符到另一个字符串,以下是函数实现部分:

//拷贝src所指向的字符串的前count个字符到dest所指向的字符串
char* my_strncpy(char* dest, const char*src, size_t count)
{
int i = 0;
char* temp = dest;
assert(dest!=NULL&&src!=NULL);
while (((i++)<count) && (*temp++ = *src++) != '\0')
{
;
}
if (*(temp) != '\0')
{
*temp = '\0';
}
return 0;
}


2.strncat函数是把src所指向的字符串的前count个字符链接到dest所指向的字符串,自动把dest所指向的字符串中的‘\0’去掉,并且在链接完成后在字符串末尾补上‘\0’。

以下是函数实现部分:

char* my_strncat(char*dest, const char*src, size_t count)
{
assert(dest != NULL&&*src != NULL);
char* temp = dest;
while (*temp != '\0')
{
++temp;
}
while (count != 0 && (*temp++ = *src++) != '\0')
{
--count;
}
return dest;
}


3.strncmp函数的功能是比较str1和str2所指向的字符串的前count个字符,若 str1 > str2,则返回一个大于0的 整数;若 str1 < str2则返回一个小于 0 的整数;若str1 = str2 则返回 0 。

以下是函数实现部分:

#define false 'z'-'A'
int my_strncmp(const char*str1, const char*str2, size_t count)
{
if (str1 == NULL || str2 == NULL || count < 0)
{
return false;
}
if (count == 0)
{
return 0;
}
while (count-- && (*str1 == *str2) && str2)
{
str1++;
str2++;
}
return *(unsigned char*)str1 - *(unsigned char*)str2;
}


4.strchr函数的功能是在src 所指向的字符串中查找字符 ch,并返回字符ch第一次出现在 src所指向的位置。

以下是函数实现部分:

char* my_strchr(const char* src, const char ch)
{
if (src == NULL)
{
return NULL;
}
const char*ptr = src;
while (*ptr != '\0')
{
if (ch == *ptr)
{
return (char*)ptr;
}
++ptr;
}
return NULL;
}


5.strrstr函数的功能是在dst所指向的字符串中查找src所指向的字符串,并返回src指向的字符串在dst中最后出现的位置。

以下是函数的实现部分:

char *my_strrstr(const char *dst, const char *src)
{
assert(dst);
assert(src);
const char *pdst = dst;
const char *psrc = src;
char *right = NULL;
while (*dst)
{
while (*pdst == *psrc)
{
if (*pdst == '\0')//如果*pdst为‘\0'则已经找到最后一个
return right = (char *)dst;
else
{
pdst++;
psrc++;
}
}
if (*psrc == '\0')  //找到一个,但不确定是不是最后一个
right = (char *)dst;
pdst = ++dst;
psrc = src;
}
return right;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: