当前位置:   article > 正文

【C语言进阶】⑦字符串函数详解_c语言字符串函数

c语言字符串函数

一、字符串函数汇总

1. 求字符串长度 - strlen():

在这里插入图片描述

1.2 函数介绍:

  1. 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包
    含 ‘\0’ );
  2. 传递的实参所指向的字符串必须要以 ‘\0’ 结束,否则得到的是一个错误值;
  3. 函数strlen()的返回值为size_t,是无符号的整数;

1.3 自己模拟实现strlen()函数的功能

1.3.1 计数器版本
int my_strlen(const char*str){
	int count = 0;
	assert(str 1= NULL);
 while(*str != '\0')
{	
	count ++;
	str++;
}
return count;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

结果:

在这里插入图片描述

2. 字符串拷贝函数 - strcpy():

2.1 函数介绍:

在这里插入图片描述

  1. 所拷贝的字符串必须以 ‘\0’ 结束;
  2. 拷贝时会将源字符串中的 ‘\0’ 拷贝到目标字符串中;
  3. 必须保证存放拷贝的字符串的目标空间必须足够大,以确保能存放源字符串;
    4.目标空间必须可变,这样才能往里面拷贝字符串;

2.2 自己模拟实现

char*  my_strcpy(char*dest,char*str)
{
		char* ret = dest;
		assert(dest != NULL);
		assert(str != NULL);
		while(*dest++ = *str++)
{
			;
}
return ret;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结果:

在这里插入图片描述

3. 字符串追加函数 - strcat()

3.1 函数介绍:

在这里插入图片描述

源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。

3.2 自己模拟实现

char*  my_strcat(char*dest,char*stc)
{
	assert(dest && stc);
char* ret = dest;
	//找目标字符串的\0
	while(*dest)
{	
		dest++;
}
//追加字符串包括\0
while(*dest++ = *stc++)//先解引用,然后赋值,然后自增,然后判断;
{	
		;	
}
return ret;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

结果:

在这里插入图片描述

4.查找字符串函数strstr():

4.1 函数介绍:

在这里插入图片描述

4.2模拟实现

思路图解:
在这里插入图片描述

char* my_strstr(const char* str1,const char* str2){
		assert(str1 && str2);
		const char* s1 =NULL;
		const char* s2 =NULL;
		const char* sta = str1;//保存原字符串的首地址
		if(*str2 == '\0')
		{
			return (char*)str1;
		}
		while(*sta)
		{
			s1 = sta;
			s2 = str2;
			while(*s1 &&  *s2 && (*s1 == s2)
			{
				s1++;
				s2++;
			}
			if(*s2 == '\0')
			{
				retuen (char*) sta;
			}	
			sta++;
	 }
	return NULL;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

结果:

在这里插入图片描述

5.strtok()函数:

5.1函数介绍:

在这里插入图片描述

  1. 功能:在字符串中查找指定标记:如在(add@acdd#sd$)中,查找标记:(@#¥),然后把标记隔开的字符打印;
  2. 第一个参数是字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分隔标记;
  3. strtok函数找到str中的标记符,并将它替换为’\0’,并且用一个指针保存这个地址,然后返回这个指针;strtok函数会改变被操作的字符串,所以在使用之前应该拷贝所要操作的字符串,然后传递拷贝的字符串给strtok函数,这样目标字符串就不会被改变;
  4. strtok函数第一个参数不为NULL时,函数讲找到str字符串中的第一个标记,strtok函数将保存它在字符串中的位置;
  5. strtok函数的第一个参数为NULL时,函数将在同一个字符串中被保存的位置开始,查找下一个标记;
  6. 如果字符串中不存在更多的标记,则返回NULL指针;
  • 例子:
int main()
{
		char arr[] = "zyth@guhdh.tech";
		char* p ="@ .";
		char tmp[20] ={0};
		strcpy(tmp,arr);
		char* ret = NULL;
		ret = strtok(tmp,p);
		printf("%s\n",ret);
		ret = strtok(NULL,p);
		printf("%s\n",ret);
			ret = strtok(NULL,p);
		printf("%s\n",ret);
进阶用法:
		for(ret = strtok(tmp,p);ret != NULL;ret = strtok(NULL,p))
		{
			printf("%s\n",ret);
		}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 结果:
    在这里插入图片描述

6.strerror()函数:

6.1函数介绍

在这里插入图片描述

函数功能:

  1. 返回错误码所对应的错误信息
  2. 必须包含头文件<errno.h> //因为errno是一个全局变量,表示错误码;
  • 例子:
int main()
{
	printf("%s\n",strerror(0));
	printf("%s\n",strerror(1));
	printf("%s\n",strerror(2));
	printf("%s\n",strerror(3));
	printf("%s\n",strerror(4));
	printf("%s\n",strerror(5));
- 使用方法:
//以读的形式打开一个文件,打开失败会返回NULL
	FILE* pf = fopen("test.txt","r");
//因为我们没有创建test.txt文件,所以程序会报错,它就会生成一个错误码>errno(全局变量),而我们使用strerror()函数来查看程序报错信息;
		if(pf == NULL)
		{
			printf("%s\n",strerror(errno));
			return 1;//表示程序结束,不继续执行
		}
		fclose(pf);//关闭文件
		pf = NULL;
	return 0;	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

在这里插入图片描述

7. perror()函数:

在这里插入图片描述

  • 函数功能:
  1. 自动读取errno的值,并转换成相应的错误信息,并且打印错误信息
  2. strerror()函数,手动读取errno的值,不会打印错误信息;

二、总结

  1. 对于字符串函数,我们往往只需要知道怎么用即可,而如果我们想进一步了解它们的实现原理,我们可以在安装Vs的文件夹里搜索相应的函数.c文件即可,它们都是库函数;
  2. 我们想要查找一些库函数可以使用的工具有:MSDN
推荐阅读
相关标签