首页 > 其他分享 >C语言-字符串相关库函数用法+模拟实现

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

时间:2023-09-23 17:01:21浏览次数:58  
标签:index 字符 ++ str1 C语言 char 字符串 库函数

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

  • 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一个一键三连,我们下期再见!^-^


标签:index,字符,++,str1,C语言,char,字符串,库函数
From: https://blog.51cto.com/u_16191221/7579512

相关文章

  • C语言实现身份运行游戏
    C语言实现:需要一款软件,程序,EXE等都可以假设我自己的程序名为游戏.exe需要的程序为XX.exe已有条件:来宾用户已启用,用户名,密码都有,现成的以其他用户身份运行的bat文件也有,双击bat文件,即可以其他用户身份运行游戏.exe需求:首先打开XX.exe该程序直接后台运行,不需要界面或任何提示,......
  • 算法题——定义一个方法自己实现 toBinaryString 方法的效果,将一个十进制整数转成字符
    用除基取余法,不断地除以基数(几进制,基数就是几)得到余数,直到商为0,再将余数倒着拼起来即可。privatestaticStringtoBinaryString(intnumber){StringBuildersb=newStringBuilder();while(true){if(number==0)break;intyushu=num......
  • 【算法】字符串
    1反转字符串题目:编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用O(1)的额外空间解决这一问题。1.双指针classSolution:defreverseString(self,s:List[str])......
  • 【Java 基础篇】StringBuilder的魔力:Java字符串处理探究
    在Java编程中,字符串是一个常见的数据类型,用于存储文本信息。然而,与字符串相关的操作可能会导致性能问题,因为字符串是不可变的,每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题,Java提供了StringBuilder类,它允许我们有效地处理可变字符串。在本篇博客中,我们将详细......
  • 【Java 基础篇】Java StringBuffer详解:更高效的字符串处理
    在Java编程中,字符串是一个常见的数据类型,用于存储文本信息。然而,与字符串相关的操作可能会导致性能问题,因为字符串是不可变的,每次对字符串进行操作都会创建一个新的字符串对象。为了解决这个问题,Java提供了StringBuffer类,它允许我们有效地处理可变字符串。在本篇博客中,我们将详细讨......
  • 【C语言版】扫雷游戏
     思路设置两个数组初始化两个数组打印数组设置雷排查雷game.h#pragmaonce#defineROW9//定义行为9#defineCOL9//定义列为9#defineROWSROW+2//排查雷时防止溢出#defineCOLSCOL+2#defineEASY_COUNT10//初步设有10个雷voidInitBoard(charboard[ROWS][COLS],i......
  • 【C语言版】扫雷游戏
     思路设置两个数组初始化两个数组打印数组设置雷排查雷game.h#pragmaonce#defineROW9//定义行为9#defineCOL9//定义列为9#defineROWSROW+2//排查雷时防止溢出#defineCOLSCOL+2#defineEASY_COUNT10//初步设有10个雷voidInitBoard(charboard[ROWS][COLS],in......
  • C语言 堆区空间,malloc
    @TOC前言一、堆区空间的理解:前面测试,普通的数组变量默认最大不能申请1M的空间,甚至远少于1M的空间,毕竟程序中的其他变量也需要使用空间。总共就1M,要省着用。想要使用更大的,没有限制的空间,C语言给我们提供了方式:如下:malloc//申请空间,理论上物理内存有多大,就能申请多大,当然并不能,......
  • 理解C语言中的void类型的指针
    1.void类型指针简介void类型的指针又被称为泛型指针,通用型指针void类型的指针:指针指向的内存地址中的数据的类型未知其他所有类型的指针都可以转换为void类型的指针,而且不需要强制类型转换(编译器会隐式/自动类型转换)void类型的指针也可以转换为任意类型的指针,需要强制类型转......
  • C语言中的函数指针以及模拟面向对象
    函数指针的概念顾名思义,函数指针就是指向函数的指针,该指针的值是函数的入口。下面的代码时函数指针的一个基本实例。#include<stdio.h>intmax_(inta,intb);intmax1_(int(*func_p)(int,int),inta,intb);intmain(){inta=10,b=20;//定义一个函......