常见的与字符串有关的库函数
- strstr() 寻找子字符串
- strcat() 字符串追加函数
- strcmp() 字符串比较函数
- strcpy() 字符串拷贝函数
- strlen() 求解字符串长度
- ...
1.strstr() 寻找子字符串
我们先来看MSDN中对该函数的功能描述:Find a substring.(寻找子字符串)
在string字符串中找子字符串strCharSet首次出现的位置,返回一个指针变量,如果子字符串strCharSet在string字符串中没有出现返回NULL;
为了更好的模拟实现这个函数的功能,我们画图来模拟寻找子字符串的过程:
(abcdcdef字符串我们称为A串,cde我们称为B串)
查找的过程需要三个指针(s1,index,s2),在下面的思路中会解释为什么需要三个指针。
我们查找的思路是:(字符指针index,s1指向A,s2指向B)(查找成功又称匹配成功)
A串中的每一个字符都有可能成为子字符串B匹配的起点,从而在A中找到B,所以我们从A的首个字符开始用index遍历A,如果与B的首个字符不相同,则字符指针index+1,跳过一个字符,查找下一个字符,如果找到字符与B的首个字符相同,这个位置很有可能匹配成功,所以我们需要把这个位置记录下来,但如果只有一个指针指向A,后续匹配仍需指针移动,会导致我们不能记录这个位置,所以我们需用另外一个指针s1从index指向的位置开始完成A和B的继续匹配,而index指针不移动,用于记录匹配的首位置,指向A的指针s1和B的指针s2继续检查下一个字符是否匹配,如果B被查找到'\0‘,则查找结束,我们需要返回本次匹配B的首个字符在A中的位置,即index对应的位置,查找结束。如果B未到'\0’已经出现与A不匹配的情况,则index++,s1=index,s2再指向B串的首字符,继续查找,直至A到'\0',则B未在A中出现过,返回NULL,匹配结束。
只看文字比较枯燥,我们结合图片来看一下:
上述图片举出了成功找到子串首次出现位置的例子,帮助我们理解strstr()查找子字符串的过程。其实还有更为高效的字符串匹配(找子字符串)的方法--KMP算法,但我们只是为了模拟strstr()函数的实现,在此处不展开讲KMP算法。
知道了strstr()函数的实现过程,我们就能模拟实现strstr()函数了。
模拟实现:
找不到子字符串则返回NULL;
char* my_strstr(const char* str, const char* str1)
{
char* s1 = str;
char* index=str;
char* s2 = str1;
while (*index)
{
if (*index==*s2)
{
s1 = index;
s2 = str1;
}
while (*s1 == *s2&&*s2&&*s1)
{
s1++;
s2++;
}
if (*s2 == '\0')
return index;
index++;
s1 = index;
s2 = str1;
}
return NULL;
}
2.strcat() 字符串追加函数
函数功能:字符串追加,在strDest字符串后追加strSrc字符串
实现条件:
- 源字符串和目标字符串都必须有结束标志'\0'
- 目标字符串strDest必须有足够大的空间实现字符串追加
模拟实现:
找到strDest字符串'\0'处,作为起始位置,追加strSrc字符串,包括strSrc字符串的终止符'\0',作为追加后形成的新字符串的结束标志。
//字符串追加函数strcat()库函数模拟实现
char* my_strcat(char* str1, const char* str2)
{
char* dest = str1;
while (*str1)str1++;
while (*str1++ = *str2++);
return dest;
}
注意:不能字符串自己给自己追加,由于字符串长度一直增加,永远都不会遇到'\0',会形成死循环。
3.strcmp() 字符串比较函数
函数功能:实现两个字符串的比较
模拟实现:
分别从两个字符串的首字符开始,逐个字符逐个字符比较(ascii码值的比较),只要出现两个字符不相等的情况,就停止比较,并返回比较结果(如下图),如果一直到两个字符串的终止符'\0'都相等,则代表这两个字符串相等,返回int值0。
函数返回:(返回一个int型的数值表示比较结果)
- str1>str2 返回一个大于0的数
- str1==str2 返回0
- str1<str2 返回一个小于0的数
模拟实现:
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2 && *str1 && *str2)
{
str1++;
str2++;
}
return (*str1 - *str2);
}
4.strcpy() 字符串拷贝函数
函数功能:实现字符串拷贝,把字符串strSrc一个字符一个字符拷贝到从strDest开始的位置。
以strSrc字符串的终止符'\0'作为拷贝的结束。
实现条件:
- 拷贝到的目标空间要足够大
模拟实现
//strcpy()字符串拷贝函数模拟实现
char* my_strcpy(char* dest, char* src)
{
char* temp = dest;
assert(dest && src);//断言,需要包含头文件<assert.h>
while (*dest++ = *src++);
return temp;
}
4.strlen() 求解字符串长度
函数功能:求解字符串长度,返回值是一个无符号整形数值,字符串的长度一定大于等于0。返回'\0'前的字符个数。
模拟实现:
size_t my_strlen(const char* str)
{
assert(str);
size_t cnt = 0;
while (*str++)cnt++;
return cnt;
}
注意:
不能用strlen(str1)-strlen(str2)的计算结果与0作比较来判断哪个字符串长度更长,因为strlen()函数的返回值是size_t类型,两个size_t的数值相减得到的结果恒为size_t类型,恒为非负值。不管用任意长度大小的两个字符串的strlen()函数的返回值相减,得到的恒为非负值,无法判断长度大小情况。
以上就是本期的全部内容,向大家分享了常见的字符串库函数用法以及模拟实现,希望以上的内容能对您有所帮助,如果文章有描述错误或者不妥之处,欢迎在评论区留言或者私信小Q,如果觉得文章不错,希望给小Q一个一键三连,我们下期再见!^-^