首页 > 其他分享 >字符串函数

字符串函数

时间:2024-07-09 20:59:22浏览次数:14  
标签:函数 str1 strcpy 参数 字符串 strlen

在编写程序的过程中,我们经常需要用到字符串函数,为了方便对字符串进行处理,C语言标准库中提供了一系列库函数。在使用标准库中的字符串函数之前,我们需要引用头文件string.h。

接下来我们对经常用到的字符串函数进行逐一介绍。

strlen的使用和模拟实现

strlen的全称是string length,意思是求字符串的长度。

strlen的使用

strlen函数的参数和返回值的类型如下:

可以看到,我们需要传给strlen函数的参数是一个指针(字符串名代表字符串中首元素地址),返回的是字符串中'\0'之前字符的个数,且返回值的类型是size_t(size_t是一种无符号整型)。

例如:

输出结果为:

可以看到,strlen函数确实是返回了字符串中'\0'之前的字符个数。

从输出结果中,我们得出一下几点:

  • 传递给strlen函数作为参数的字符串中必须以'\0'结尾。
  • 给strlen函数的参数必须是一个字符指针。
  • stelen函数的使用必须包含头文件string.h。
  • strlen函数的返回值是一个无符号整型。

strlen的模拟实现

通过strlen函数的使用,我们知道了strlen函数的作用,为了加深对strlen函数的理解,接下来我们可以对strlen函数进行模拟实现。

例如:

为了和strlen函数进行区分,我们将自定义的函数命名为my_strlen,函数的返回类型为size_t,count用来计算字符个数,为了使count和函数的返回值类型一致,我们将count的类型也设置为size_t。

输出结果为:

输出结果与字符串中字符个数相匹配,完成模拟实现。

注:字符串中自动以‘\0’结尾,若输入strlen函数中的是字符数组,必须在结尾加上'\0',否则数组会越界,直到遇到‘\0’才停止。

strcpy的使用和模拟实现

strcpy的全称是string copy,意思是对字符串进行复制。

strcpy的使用

可以看到,strcpy函数的返回值是一个字符指针,指向的是复制好的字符串的首元素地址。strcpy函数的第一个参数是要复制数据进去的字符串的地址,第二个参数是被复制数据的字符串的地址。

例如:

输出结果为:

可以看到,str2字符串被复制到了str1字符串中。

从输出结果中,我们需要注意一下几点:

  • strcpy函数的返回值是一个指针,可以使用字符指针接受,也可以不接受。
  • str1的空间必须大于大于str2的空间,否则数组会越界。
  • 在使用strcpy函数之前必须引用头文件string.h。
  • str1的内容必须是可修改的。
  • 两个字符串都必须以'\0'结尾。

strcpy的模拟实现

从上面对strcpy函数的使用中,我们知道了strcpy函数的使用方法,为了加深对strcpy函数的理解,接下来我们对strcpy函数进行模拟实现。

例如:

为了与strcpy函数进行区分,我们将自定义函数命名为my_strcpy。通过循环将str2中的元素一个个复制给str1,直到遇到'\0',复制结束,最后将'\0'复制到str1中,返回str1首元素地址。

输出结果为:

可以看到,我们成功模拟实现了strcpy函数。

注意:参数1的空间一定要大于等于参数2的空间,否则会造成越界。

strcat的使用和模拟实现

strcat为Concatenate strings,意思是连接字符串

strcat的使用

可以看到,strcat函数的返回值是一个字符指针,指向连接好的字符串的首元素地址,参数1为目标字符串首元素地址,参数2为源字符串首元素地址。

例如:

输出结果为:

可以看到,str1确实发生了改变,返回的地址确实为str1首元素地址。

从输出结果中,我们需要注意以下几点:

  • 参数1的空间必须足够大,否则会造成数组越界。
  • 参数1和参数2必须都以'\0'结尾。
  • 在使用strcat函数之前要引用头文件string.h。
  • 目标空间必须是可修改的。

strcat的模拟实现

通过上面对strcat函数的使用,我们已经了解了strcat函数的具体用法,为了加深对strcat函数的理解,接下来我们对strcat函数进行模拟实现。

例如:

可以看到,在my_strcat中,我们先是将str1的指针移动到'\0',在将str2的数据有序复制给str1,直到遇到'\0',在这个过程中,我们必须保证str1的空间足够容纳str1和str2的数据。

输出结果为:

从输出结果可以看出,我们成功对strcat函数进行模拟实现。

注意:参数1空间必须足够容纳参数1和参数2的内容。

strcmp的使用和模拟实现

strcmp为string compare,意思是比较字符串的大小。

strcmp的使用

可以看到,函数的返回值类型是一个整型,如果参数1比参数2大,则返回大于0的数,如果参数1比参数2小,则返回小于0的数,如果参数1和参数2相等,则返回0。

对字符串进行比较的时候,我们比较的是字符串中对应位置的字符的ASCII码值,ASCII码值大的字符串就大,以此类推。

例如:

输出结果为:

可以看出,g的ASCII码比f的ASCII码大,返回大于0的数字。

从输出结果可以看出,我们需要注意以下几点:

  • 参数1和参数2必须是以'\0'结尾的字符串。
  • 在使用strcmp函数之前需要引用头文件string.h。
  • 字符串的大小与字符串中对应位置字符的ASCII码有关,与字符串长度无关。

strcmp的模拟实现

从上面strcmp函数的使用中,我们已经对strcmp函数有了初步的了解,为了加深对strcmp函数的理解,接下来我们将模拟实现strcmp函数。

例如:

可以看出,在my_strcmp函数中,若是两个字符串相等,则返回0,若是不相等,则返回对应位置字符的ASCII码值的差,同样满足strcmp函数的要求。

输出结果为:

从输出结果可以看出,我们完成了对strcmp函数的模拟实现。

注意:字符串大小与字符串中对应位置的字符ASCII码值有关,与字符串长度无关。

strncpy的使用

strncpy与strcpy的作用相同,都是复制字符串,唯一的区别的strncpy多了一个参数num,可以定义

复制数据的个数。

可以看到,strncpy函数多了一个size_t类型的参数,用来定义复制的数据大小,其他参数以及函数返回值类型与strcpy相同。

例如:

输出结果为:

字符串复制结束后s2并不会在s1后面自动加'\0',这点与strcpy略有差异。

从输出结果来看,我们需要注意以下几点:

  • 参数1和参数2必须都是以'\0'结尾的字符串。
  • 参数1的内存空间必须足够大。
  • 在使用strncpy函数之前需要先引用头文件string.h。

strncat的使用

strncat函数与ctrcat函数作用相同,都是字符串连接函数,唯一的区别是strncat函数多了一个参数num,可以指定连接的字符个数。

可以看到,相比于strcat函数,ctrncat函数中多了一个参数num,用来指定连接字符的个数。

例如:

输出结果为:

从输出结果来看,我们需要注意以下几点:

  • 传给函数的参数1和参数2必须是以'\0'结尾的字符串。
  • 在使用strncat函数之前需要引用头文件string.h。
  • 参数3必须为正数。
  • 参数1的内存空间必须足够大。

strncmp的使用

strncmp函数与strcmp函数作用相同,都是字符串比较函数,唯一的区别是strncmp函数多了一个参数num,用来指定字符串中比较的字符的个数。

可以看到,相比于strcmp函数,strncmp函数多了一个参数,用来指定比较大小的字符个数。

例如:

输出结果:

从输出结果来看,我们需要注意以下几点:

  • 参数1和参数2必须是以'\0'结尾的字符串。
  • 参数3必须为正数。
  • 在使用strncmp之前需要引用头文件string.h。

strstr的使用和模拟实现

在许多应用场景中,我们需要在一个字符串中寻找另一个字符串,即在主串中寻找子串。如果碰到这种场景,我们可以使用strstr函数。

strstr为Locate substring,意思是查找子字符串。

strstr的使用

我们可以看到,strstr函数需要包含两个参数,参数1是主串的地址,参数2是子串的地址,返回值为主串中与子串匹配的字符串的地址。

例如:

输出结果为:

从输出结果可以看出,我们需要注意以下几点:

  • strstr函数的两个参数必须是以'\0'结尾的字符串;
  • 在使用strstr函数之前需要先引用头文件string.h。
  • 返回的是主串中与子串相同的数据的地址,若找不到则返回空指针

strstr的模拟实现

通过上面对strstr函数的使用,我们对strstr函数有了初步的认识,为了加深对strstr函数的理解,接下来我们将模拟实现strstr函数。

例如:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>

char* my_strstr(const char* str1, const char* str2)
{
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;
}


int main()
{
	char str1[] = "abcdefghh";
	char str2[] = "efg";
	char* s = my_strstr(str1, str2);
	printf("%s\n", s);
	return 0;
}

可以看到,在my_strstr函数中,const是对指针进行修饰,使其无法对指针指向的内容进行更改,使指针变得相对安全。在返回指针的时候,为了使其与函数的返回值类型相同,使用(char*)将其强制类型转换成char*类型的指针。

输出结果为:

注意:若主串中有两个相同的子串,strstr函数的返回值是指向主串中第一个与子串匹配的字符串的地址。

以上为常用的字符串函数,若想了解更多字符串函数,请到https://legacy.cplusplus.com/

标签:函数,str1,strcpy,参数,字符串,strlen
From: https://blog.csdn.net/weixin_71853810/article/details/140207424

相关文章

  • Golang 切片作为函数参数传递的陷阱与解答
    作者:林冠宏/指尖下的幽灵。转载者,请:务必标明出处。GitHub:https://github.com/af913337456/出版的书籍:《1.0-区块链DApp开发实战》《2.0-区块链DApp开发:基于公链》例子切片作为函数参数传递的是值用来误导切片作为函数参数传递的是引用函数内切片append引起......
  • 常见python数据类型及其相对应的函数
     列表:list是个有值序列,可以被修改的元素1.访问方式:foriinrange(len(ls)):   forcinls:fori,cinenumerate(ls):Python列表函数1cmp(list1,list2)比较两个列表的元素2len(list)列表元素个数3max(list)返回列表元素最大值4......
  • 09 为内核支持函数调用
    在[[08内核第一条指令|上一节]]我们使用了编写entry.asm函数中编写了内核的第一条指令,但是我们使用的汇编.这里注意我们仍然是嵌入了这段asm代码到我们的rust代码之中,然后进行编译.但是即使连使用fnmain都不被允许,因此我们如果希望使用rust来编写内核代码,因此我们最好为内核......
  • 函数进阶应用2
    查询并标记停产商品要求:停产商品标记为红颜色具体操作选中B列——开始选项卡——条件规则——新建规则,选择“使用公式……格式的单元格”——在公式输入框中输入“=VLOOKUP(B2,选择区域,返回列,精确匹配)="停产”——格式,选填充色为红色——确定*2操作演示有效性与函......
  • jmeter自定义函数开发—Web3钱包生成工具
    之前使用Jmeter进行接口测试时,有生成钱包地址的需求,于是有时间就简单写了个自定义函数环境说明JDK1.8.0,Jmeter5.4.3,maven构建工具实现代码新建一个简单的maven项目即可,以下是pom.xml配置<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org......
  • C#字符串操作:判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中的几
    要判断一个字符串是否存在于另一个字符串按特定字符分割后的子字符串中,可以使用以下几种方法:方法一:使用Split和Array.Exists你可以使用Split方法将字符串分割成子字符串数组,然后使用Exists方法检查目标字符串是否在数组中:usingSystem;classProgram{staticvoid......
  • 【TWVRP】蚁群算法求解带时间窗的车辆路径规划(目标函数:最短距离)【含Matlab源码 4969期
    ✅博主简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,Matlab项目合作可私信或扫描文章底部QQ二维码。......
  • MyBatisPlus的Mapper.xml入参List执行in函数
    使用情景这个是开发过程中比较常见的情景,入参一个list,在Mapper.xml里面执行sql的in函数,今天来记录下这个问题,希望可以给大家一点帮助启发。Mapper文件解决方案xml文件<selectid="get"resultType="com.vo.tVo">SELECTnameFROMus......
  • 函数指针与回调函数
    #include<iostream>usingnamespacestd;//函数指针就是指向函数的指针/**用途:   函数A要作为实际参数传递给函数B,在B中调用,应该就是回调函数。这时候就要用函数指针。   因为有些功能是流程中的一部分,但是不清楚,需要个性化,只能把公共流程写好,中间穿插个性化内容,   ......
  • 组合API-reactive函数
      <template><divclass="container"><div>{{obj.name}}</div><div>{{obj.age}}</div><button@click="updateName">修改数据</button></div></template><script......