剩余字符串函数的功能介绍与模拟实现。
strcmp
比较两个字符串的大小:
- 如果第一个字符串大于第二个字符串,返回一个大于0的数字;
- 如果相等,返回0;
- 如果第一个字符串小于第二个字符串,返回一个小于0的数字;
这个比较简单,模拟实现如下:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
strncpy
类似strcpy,拷贝num个字符。
int main()
{
char arr1[10] = "xxxxxxx";
char arr2[] = "abcdef";
strncpy(arr1, arr2,3);
printf("%s\n", arr1);
return 0;
}
作用是将arr2中的3个字符拷贝到arr1里面。模拟实现如下:
char* my_strncpy(char* dst, const char* src,size_t num)
{
assert(dst && src);
char* ret = dst;
while (num && (*dst++ = *src++))
num--;
if (num)
while (--num)
*dst++ = '\0';
return ret;
}
这里精髓在while (num && (*dst++ = *src++)) 这一句上。自己写的代码比较丑,这里参考了源码的写法,注意理解。(*dst++ = *src++)实现了拷贝,然后通过num–来控制拷贝的数量。如果说拷贝完成之后,num还没有归零,那么其余部分都补成\0。
strncat
类似strcat,多一个参数n,在目标字符串上拼接n个源字符串中的字符。
参考上面的实现,模拟实现如下:
char* my_strncat(char* dst, const char* src, size_t num)
{
assert(dst && src);
char* ret = dst;
while(*dst)//找到dst里的\0
{
dst++;
}
while (num && (*dst++ = *src++))//参考ncpy
{
num--;
}
return ret;
}
strstr
查找目标字符串中是否包含子字符串。如果存在,返回子字符串在目标字符串中的起始位置,如果不存在,返回NULL。
实现如下:
const char* my_strstr(const char* str1, const char* str2)
{
assert(str1);
assert(str2);
const char* cp = str1;
const char* s1 = NULL;
const char* s2 = NULL;
while (*cp)//cp: 记录可能找到匹配的字符串的起始位置
{
s1 = cp;
s2 = str2;
//如果子串是空,返回str1
if (*str2 == '\0')
return str1;
while (*s1 == *s2 && *s1 && *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cp;
cp++;
}
return NULL;
}
分析一下:
- cp作为记录匹配字符串的起始位置
- s1 和s2 分别指向原字符串和子字符串,做运算时只通过这两个指针操作;
strerror
返回一个错误码所对应错误信息的起始地址。举个例子:
int main()
{
FILE* pf = fopen("add.txt", "r");
if (pf == NULL)
{
printf("打开失败,失败原因:%s\n", strerror(errno));
return 1;
}
else
{
printf("打开文件成功\n");
}
return 0;
}
错误码会记录到errno这个全局变量里,strerror就是通过错误码打印错误信息。
内存函数memcpy
针对内存块的拷贝,无论数据是什么。
模拟实现如下:
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest && src);
while (num--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
以字节单位拷贝源内存区数据到目标内存区。
本文介绍了C语言中的几个核心字符串处理函数:strcmp用于比较字符串,strncpy和strncat用于字符复制和拼接,strstr用于查找子串,strerror返回错误信息,以及内存拷贝函数memcpy。通过模拟实现展示了这些函数的工作原理和用法。
1278





