c语言字符串函数下:strcmp、strncpy、strncat、strncmp、strstr、strtok、strerror

承接上文:(5条消息) c语言字符串函数上:strlen、strcpy、strcat_vpurple__的博客-CSDN博客
 


目录

1.strcmp 字符串比较函数

1.1strcmp使用方法

1.2strcmp 模拟实现

2.长度受限制的字符串函数介绍

2.1 strncpy

2.1.1strncpy基础使用

2.1.2注意事项

2.2strncat

2.2.1strncat的基础使用

2.2.2注意事项

2.3strncmp

2.3.1注意事项

3.字符串查找

3.1strstr

3.1.1strstr的基础使用

3.1.2strstr模拟实现

3.2strtok切割字符串

3.2.1strtok的基础使用

3.2.2 注意事项

4.错误信息报告

4.1strerror

4.1.1 strerror的演示使用

4.1.2 erron

 5.字符分类函数

6.字符转换函数



1.strcmp 字符串比较函数

比较字符串内容

int strcmp(const char* str1, const char* str2);

1.1strcmp使用方法

比较两个字符串时,字符两两比较。


1.2strcmp 模拟实现


#include<stdio.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);//保证指针有效性
	while (*str1 != '\0' || *str2 != '\0')
	{
		if (*str1 - *str2!=0)
		{
			return *str1-*str2;
		}
		str1++;
		str2++;
	}
	return 0;
}


int main()
{
	char arr1[] = { "aihao" };
	char arr2[] = { "nihao" };
	if (my_strcmp(arr1, arr2) == 0)
	{
		printf("=\n");
	}
	else if (my_strcmp(arr1, arr2) > 0)
	{
		printf(">\n");
	}
	else
	{
		printf("<\n");
	}
	return 0;
}

2.长度受限制的字符串函数介绍

先复习一波长度不受限制的字符串函数 strcpy、strcat以及strcmp。

它们都执行到’\0‘。

(2条消息) c语言字符串函数上:strlen、strcpy、strcat_vpurple__的博客-CSDN博客https://blog.csdn.net/vpurple_/article/details/125873390有问题,比如strcpy目标空间的长度不够大的时候,可能会造成下图所示情况:

 所以C语言提供了相对安全的长度受限制的字符串函数strncpy、strncat、strncmp。


2.1 strncpy

char * strncpy ( char * destination, const char * source, size_t num );

2.1.1strncpy基础使用


2.1.2注意事项

感慨一下:现在才明确了char arr[5]中存储的字符串最多只能存除'\0'以外的4个字符,剩下一个位置是'\0',如果存储5个字符组成的字符串,加上’\0‘就是6个字符,会造成数组访问越界。

1.strncpy只拷贝num个字符从源字符串到目标空间,目标空间中的其余字符保留。

如下所示:

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

如下所示:


2.2strncat

char * strncat ( char * destination, const char * source, size_t num );

2.2.1strncat的基础使用


2.2.2注意事项

1.strncat向目标空间追加规定的字符个数并在末尾补上'\0'.

如下所示:

注下两张图的arr[10]应该改为arr[]

追加之前:

追加之后:

2.如果源字符串的长度小于num,则拷贝完源字符串之后,就停止不会追加额外的\0。 

如下所示:


2.3strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

2.3.1注意事项

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

如下所示:


3.字符串查找


3.1strstr

在一个字符串中查找字串的一个函数(在一个字符串查找另外一个字符串)。

char * strstr ( const char *str1, const char * str2);

3.1.1strstr的基础使用

3.1.2strstr模拟实现



#include<stdio.h>
#include<assert.h>

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

}


int main()
{

	char arr1[] = { "abc@qq.com" };
	char arr2[] = { "qq" };
	char* ret = my_strstr(arr1, arr2);

	if (ret == NULL)
		printf("此串不存在\n");
	else
		printf("%s\n", ret);
	
	return 0;
}

3.2strtok切割字符串

char * strtok ( char * str, const char * sep );

3.2.1strtok的基础使用

 改进:


3.2.2 注意事项

1.sep参数是个字符串,定义了用作分隔符的字符集合。

2.第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标 记。

3.strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。

(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)

4.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。

5.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。

6.如果字符串中不存在更多的标记,则返回 NULL 指针。


4.错误信息报告


4.1strerror

返回错误码所对应的错误信息。

C语言的库函数,在执行失败的时候,都会设置错误码。比如:0.1.2……

错误码有其对应的错误信息。

char * strerror ( int errnum );

4.1.1 strerror的演示使用

4.1.2 erron

erron 是C语言设置的一个全局的错误码存放的变量。
只要c语言库函数调用错误,就会把错误码放到erron里面去。

在程序运行过程中如果有多次错误的话,erron记录的是最新的错误码。

strerrno的使用场景


 5.字符分类函数

头文件: ctype.h

函数如果他的参数符合下列条件就返回真,不符合就返回假 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任何可打印字符,包括图形字符和空白字符

6.字符转换函数

 int tolower ( int c );
 int toupper ( int c );

举个例子:


你好,我是媛仔!很开心你能够看到这路i,终于整理完字符串函数啦,开心!!如果觉得对你有所帮助的话,希望可以点赞评论收藏,最后再来一个大大的关注让更多的人看到就好啦!!祝你天天开心^-^

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vpurple__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值