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

C语言学习之路

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


文章目录

  • C语言学习之路
  • 前言
  • 一、strncpy函数
    • 1、函数的用途:
    • 2、函数的使用:
  • 二、strncat函数
    • 1、函数的用途
    • 2、函数的使用:
  • 三、strncmp函数
    • 1、函数的用途
    • 2、函数的使用
  • 四、strstr函数
    • 1、函数的用途:
    • 2、函数的使用:
    • 3、函数的模拟实现:
      • 思路分析:
      • 代码实现:
      • 代码分析:
  • 五、strtok函数
    • 1、函数的用途:
    • 2、函数的使用:
  • 六、strterror函数
    • 1、函数的用途:
    • 2、函数的使用:
      • (1)函数的简单实用:
      • (2)函数的实际应用场景:
  • 七、字符分类函数
  • 八、字符转化函数


前言

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


一、strncpy函数

1、函数的用途:

第二十五章 字符串函数(2)_第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;
}

第二十五章 字符串函数(2)_第2张图片
注意事项:

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

二、strncat函数

1、函数的用途

第二十五章 字符串函数(2)_第3张图片
这个函数的作用就是将源字符串中的n个字符,附加到目标字符串的后面。

2、函数的使用:

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

第二十五章 字符串函数(2)_第4张图片

三、strncmp函数

1、函数的用途

第二十五章 字符串函数(2)_第5张图片
strncmp函数的作用就是将两个字符串中的前n个字符进行比较,最终返回一个比较的结果。这里需要注意的是,当函数将两个字符串中的字符进行依次逐一比较的时候,当出现了差别时,就会返回对应的结果。或者当前n个字符的比较上,两个字符串都是相等的,此时就返回相等。

2、函数的使用

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

第二十五章 字符串函数(2)_第6张图片

四、strstr函数

1、函数的用途:

第二十五章 字符串函数(2)_第7张图片
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;
}

第二十五章 字符串函数(2)_第8张图片

3、函数的模拟实现:

思路分析:

第二十五章 字符串函数(2)_第9张图片

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

代码实现:

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、函数的用途:

第二十五章 字符串函数(2)_第10张图片

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

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

2、函数的使用:

#include
#include
int main()
{
	char str1[] = "[email protected]";
	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;
}

第二十五章 字符串函数(2)_第11张图片

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

#include
#include
int main()
{
	char str1[] = "[email protected]";
	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)_第12张图片

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

2、函数的使用:

(1)函数的简单实用:

#include
#include
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)_第13张图片

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

#include
#include
#include
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 将大写字母转化成小写字母

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

你可能感兴趣的:(C语言学习之路)