第二十五章 字符串函数(2)

C语言学习之路

第一章 初识C语言
第二章 变量
第三章 常量
第四章 字符串与转义字符
第五章 数组
第六章 操作符
第七章 指针
第八章 结构体
第九章 控制语句之条件语句
第十章 控制语句之循环语句
第十一章 控制语句之转向语句
第十二章 函数基础
第十三章 函数进阶(一)(嵌套使用与链式访问)
第十四章 函数进阶(二)(函数递归)
第十五章 数组进阶
第十六章 操作符(详解及注意事项)
第十七章 指针进阶(1)
第十八章 指针进阶(2)
第十九章 指针进阶(3)
第二十章 指针进阶(4)
第二十一章 数据的存储(秒懂原、反、补码)
第二十二章 指针和数组笔试题详解(1)
第二十三章 指针和数组笔试题详解(2)
第二十四章 字符串函数(1)
第二十五章 字符串函数(2)



前言

本章将继续讲解剩余的与字符串相关的常用库函数,希望对大家有所帮助。


一、strncpy函数

1、函数的用途:

在这里插入图片描述
我们第一眼看到这个函数的时候,我们会发现在函数的名称上,这个函数和strcpy是非常相似的。除了函数名,这两个函数的作用也很相似。只是strcpy是将整个字符串复制给目标空间,而strncpy是将源字符串中的n个字符复制给目标空间。
形参列表中多出来的num其实就是我们在使用的时候所指定的n个字符。

2、函数的使用:

int main()
{
	char str1[]="aaaaaaaaaaa";
	char str2[]="xxxxxxxxxx";
	printf("%s\n",strncpy(str1,str2,3));
	return 0;
}

在这里插入图片描述
注意事项:

  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

二、strncat函数

1、函数的用途

在这里插入图片描述
这个函数的作用就是将源字符串中的n个字符,附加到目标字符串的后面。

2、函数的使用:

int main()
{
	char str1[20]="aaaa";
	char str2[]="xxxxxxxxx";
	printf("%s\n",strncat(str1,str2,4));
	return 0;
}

在这里插入图片描述

三、strncmp函数

1、函数的用途

在这里插入图片描述
strncmp函数的作用就是将两个字符串中的前n个字符进行比较,最终返回一个比较的结果。这里需要注意的是,当函数将两个字符串中的字符进行依次逐一比较的时候,当出现了差别时,就会返回对应的结果。或者当前n个字符的比较上,两个字符串都是相等的,此时就返回相等。

2、函数的使用

int main()
{
	char str1[20]="aaaaaaaaaaa";
	char str2[]="xxxxx";
	printf("%s",strncmp(str1,str2,3));
	return 0;
}

在这里插入图片描述

四、strstr函数

1、函数的用途:

在这里插入图片描述
strstr函数的作用就是在一个str1字符串中寻找str2字符串,并返回str2字符串在str1中第一次出现的位置的首元素地址,倘若没找到,则返回一个空指针。

2、函数的使用:

int main()
{
	char str1[] = "abcdefgh";
	char str2[] = "cde";
	char* ret = strstr(str1, str2);
	if (ret != NULL)
	{
		printf("已经找到字符串。%s\n", ret);
	}
	else
	{
		printf("未找到该字符串!\n");
	}
	return 0;
}

在这里插入图片描述

3、函数的模拟实现:

思路分析:

在这里插入图片描述

我们传入了两个图中所示的黑色指针,我们对两个指针所指的地方进行访问,如果二者的内容相等,那么就让蓝色的指针向后偏移,比较后面的字符串是否相等。如果相等,返回对应的黑色指针,如果不相等,就让黑色指针继续偏移,直到二者对应的空间数据相等。

代码实现:

char* my_strstr(const char* str1, const char* str2)
{
	assert(*str1!='\0');
	assert(*str2!='\0');
	while (*str1 != '\0')
	{
		while (*str1 != *str2)
		{
			str1++;
		}

		int count = 0;
		char* p1 = str1;
		char* p2 = str2;

		for (int i = 0; i < strlen(str2); i++, p2++, p1++)
		{
			if (*p1 == *p2)
			{
				count++;
			}
		}
		if (count == strlen(str2))
		{
			return str1;
		}

		str1++;
	}
	return NULL;

}
int main()
{
	char str1[] = "abcdefg";
	char str2[] = "bcd";
	printf("%s\n", my_strstr(str1, str2));
}

代码分析:

上述的代码就是将刚才所展示图解思路进行了翻译。如果能够在str1中找到str2的话,那么str1和str2的首元素必定是相同的。在二者首元素相同的条件下,我们再去比较剩余的元素。
所以我们利用str1和str2两个字符串指针去比较首元素。然后我们利用p1和p2向后偏移strlen(str2)次,去比较二者剩余的字符是否相等。同时我们创建一个整型变量int count来记录二者后面相同的元素个数。如果相同的元素个数等于strlen(str2)的长度,就说明在str1中找到了str2在字符串。所以这个时候,我们直接返回此时的str1,这样我们就得到了str2数组的首元素在str1中的地址。

五、strtok函数

1、函数的用途:

在这里插入图片描述

想要了解这个函数的作用,我们可以先看一下下面这个例子:
比如我们写了一个邮箱,这个邮箱的地址为:xxxxxxx@163.com。我们想将这个地址分成三部分,xxxxxxx,163,com。这个时候我们就需要用到strtok函数。
所以这个函数的作用就是利用一个字符串中的字符去截取部分字符串。当在某个字符串中找到了需要截取位置的字符,这个函数就会将这个字符改成\0
在理解了这个函数作用后,我们来分析一下这个函数的形参列表。列表中共有两个形参,其中一个是被截取的字符串,另外一个由截取位置的字符组成的集合。
这个函数的返回值类型是一个字符指针。那么我们返回的内容肯定是一个字符串的首元素地址。比如我们截取了163这个字符串,此时返回值就是字符1所对的地址。
注意事项:

  • sep参数是个字符串,定义了用作分隔符的字符集合
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。

2、函数的使用:

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "123456@163.com";
	char str1_[200]={0};
	strcpy(str1_,str1);
	char str2[] = "@.";
	char* ret = 0;
	ret = strtok(str1_, str2);
	printf("%s\n", ret);
	ret = strtok(NULL, str2);
	printf("%s\n", ret);
	ret = strtok(NULL, str2);
	printf("%s\n", ret);
	return 0;
}

在这里插入图片描述

但是我们发现上述的代码过于笨重,我们可以将上述代码改写成循环的方式:

#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "abcdefg@163.com";
	char str2[] = "@.";
	char str1_[200] = { 0 };
	strcpy(str1_, str1);
	for (char* ret = strtok(str1_, str2); ret != NULL; ret = strtok(NULL, str2))
	{
		printf("%s\n", ret);
	}
	return 0;
}

六、strterror函数

1、函数的用途:

在这里插入图片描述

这个函数的作用其实很简单,就是将一个错误码翻译成对应的错误原因,然后将这个错误原因包装成一个字符串,接着返回这个字符串的首元素地址。

2、函数的使用:

(1)函数的简单实用:

#include<stdio.h>
#include<string.h>
int main()
{
	printf("%s\n",strerror(1));
	printf("%s\n",strerror(2));
	printf("%s\n",strerror(3));
	printf("%s\n",strerror(4));
	return 0;
}

在这里插入图片描述

(2)函数的实际应用场景:

#include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{
	FILE* pf = fopen("code.txt", "r");//利用一个函数开一个文件,并用一个FILE类型的指针接受返回值,如果打开失败了,那么就会返回一个空指针。并且将错误码记录在一个变量类型为errno的数据类型中。
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));//利用errno和strerror函数打印错误信息
	}
	fclose(pf);//利用函数和指针关闭文件
	pf = NULL;//将指针重置为空指针

	return 0;
}

七、字符分类函数

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A ~ F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A ~ Z
isalnum字母或者数字,a ~ z,A ~ Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

八、字符转化函数

函数作用
toupper将小写字母转换为大写字母
tolower将大写字母转化成小写字母

“好的冰球运动员滑到冰球在的地方,而伟大的冰球运动员则滑到冰球将会出现的地方。”
——史蒂夫·鲍尔默

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牙科就诊管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线查看数据。管理员管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等功能。牙科就诊管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 管理员在后台主要管理病例管理、字典管理、公告管理、药单管理、药品管理、药品收藏管理、药品评价管理、药品订单管理、牙医管理、牙医收藏管理、牙医评价管理、牙医挂号管理、用户管理、管理员管理等。 牙医列表页面,此页面提供给管理员的功能有:查看牙医、新增牙医、修改牙医、删除牙医等。公告信息管理页面提供的功能操作有:新增公告,修改公告,删除公告操作。公告类型管理页面显示所有公告类型,在此页面既可以让管理员添加新的公告信息类型,也能对已有的公告类型信息执行编辑更新,失效的公告类型信息也能让管理员快速删除。药品管理页面,此页面提供给管理员的功能有:新增药品,修改药品,删除药品。药品类型管理页面,此页面提供给管理员的功能有:新增药品类型,修改药品类型,删除药品类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值