ips99

C语言-字符串相关库函数用法+模拟实现

常见的与字符串有关的库函数

  • strstr() 寻找子字符串
  • strcat() 字符串追加函数
  • strcmp() 字符串比较函数
  • strcpy() 字符串拷贝函数
  • strlen() 求解字符串长度
  • ...

1.strstr() 寻找子字符串


我们先来看MSDN中对该函数的功能描述:Find a substring.(寻找子字符串)


C语言-字符串相关库函数用法+模拟实现_字符串匹配

C语言-字符串相关库函数用法+模拟实现_strlen()_02

在string字符串中找子字符串strCharSet首次出现的位置,返回一个指针变量,如果子字符串strCharSet在string字符串中没有出现返回NULL;

为了更好的模拟实现这个函数的功能,我们画图来模拟寻找子字符串的过程:

C语言-字符串相关库函数用法+模拟实现_字符串长度_03

     (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,匹配结束。

只看文字比较枯燥,我们结合图片来看一下:

C语言-字符串相关库函数用法+模拟实现_字符串长度_04

C语言-字符串相关库函数用法+模拟实现_字符串长度_05

C语言-字符串相关库函数用法+模拟实现_字符串_06

C语言-字符串相关库函数用法+模拟实现_字符串_07

C语言-字符串相关库函数用法+模拟实现_字符串_08

C语言-字符串相关库函数用法+模拟实现_字符串_09

                                          

上述图片举出了成功找到子串首次出现位置的例子,帮助我们理解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() 字符串追加函数

C语言-字符串相关库函数用法+模拟实现_strlen()_10

函数功能:字符串追加,在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',会形成死循环。

C语言-字符串相关库函数用法+模拟实现_字符串匹配_11

3.strcmp() 字符串比较函数

C语言-字符串相关库函数用法+模拟实现_strlen()_12

函数功能:实现两个字符串的比较

模拟实现:

分别从两个字符串的首字符开始,逐个字符逐个字符比较(ascii码值的比较),只要出现两个字符不相等的情况,就停止比较,并返回比较结果(如下图),如果一直到两个字符串的终止符'\0'都相等,则代表这两个字符串相等,返回int值0。

C语言-字符串相关库函数用法+模拟实现_字符串_13

函数返回:(返回一个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() 字符串拷贝函数

C语言-字符串相关库函数用法+模拟实现_字符串_14

函数功能:实现字符串拷贝,把字符串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() 求解字符串长度

C语言-字符串相关库函数用法+模拟实现_strlen()_15

函数功能:求解字符串长度,返回值是一个无符号整形数值,字符串的长度一定大于等于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一个一键三连,我们下期再见!^-^


C语言-字符串相关库函数用法+模拟实现
posted @   迷途小石头  阅读(131)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示