strstr/strtok /strerror /字符分类(转换)函数

strstr

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

  • 返回一个指向str1中第一个出现的str2的指针,如果str2不是str1的一部分,则返回一个空指针
  • 返回值指向在str2中指定的整个字符序列的str1中第一个出现的指针,如果序列不在str1中,则为空指针
  • 头文件为`#include<string.h>

strcpy函数的模拟实现

主函数

int main()
{
	char arr1[] = "abbbcdef";
	char arr2[] = "bbc";
	char* ret = my_strstr(arr1, arr2);
	if (ret != NULL)
		printf("%s\n", ret);
	else
		printf("找不到\n");
	return 0;
}

my_strstr函数

#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
	assert(str1);
	char* cp = str1;
	char* s1 = cp;
	char* s2 = str2;
	if (*str2 == '\0')
		return str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cp;
		cp++;
	}
	return NULL;
}

str1中寻找是否有str2,所以str1和str2指针不变,用const修饰

分为几种情况:

  1. str2为空时,直接返回str1的地址
  2. str1中有str2时,s2先到达’\0’(或者与s1同时到达),返回此时cp所在的位置,打印此位置及之后的字符
    在这里插入图片描述
  3. str1中没有str2时,及cp到达‘\0’,此时返回NULL

strtok

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

  • sep参数是个字符串,定义了用作分隔符的字符集合
	char sep[] = "@.#";
  • 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
	char arr[] = "shunvxiaoying@qq.com@123#456";
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
	char copyarr[50];
	strcpy(copyarr, arr);//临时拷贝

在这里插入图片描述

  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
	ret = strtok(copyarr, sep);
	printf("%s\n", ret);

在这里插入图片描述

  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记
	ret = strtok(NULL, sep);
	printf("%s\n", ret);

在这里插入图片描述

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

整个字符串已经找到了最后的 ‘\0’

  • 头文件为`#include<string.h>

用代码来帮助理解

int main()
{
	char arr[] = "shunvxiaoying@qq.com@123#456";
	char copyarr[50];
	strcpy(copyarr, arr);
	char sep[] = "@.#";
	char* ret = NULL;
	for (ret = strtok(copyarr, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	return 0;
}

strerror

char * strerror ( int errnum );

  • 返回错误码,所对应的错误信息
  • 库函数在执行的时候,发生了错误,会将一个错误码存放errno这个变量中,errno是C语言提供的一个全局的变量
  • 头文件为`#include<string.h>

例如:0~9的错误信息

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d: %s\n", i, strerror(i));
	}
	return 0;
}

在这里插入图片描述

实际应用场景(之一)

C语言中可以操作文件
操作文件的步骤

  1. 打开文件
  2. 读/写
  3. 关闭文件
int main()
{
	//打开只读文件data.txt
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//与成功打开文件做区分
	}
	//读文件

	//关闭文件
	fclose(pf);
	return 0;
}

错误信息
在这里插入图片描述
补充
perror也是报错信息输出

		printf("fopen: %s\n", strerror(errno));
		perror("fopen");

此时的两个报错格式与内容都相同
在这里插入图片描述

字符分类函数

头文件皆为#include<ctype.h>

函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
ispace空白字符:空格 ,换页\f,换行\n,回车\t,制表符\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标点符号,任何不属于数字或者字母的图形字符(可打印)
ispraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

在这里插入图片描述

字符转换函数

头文件皆为#include<ctype.h>

int tolower ( int c ); ----- 大写转小写
int toupper ( int c ); ----- 小写转大写

例题

#include<ctype.h>
int main()
{
	char arr[20] = { 0 };
	printf("输入: ");
	gets(arr);//遇到空格可以继续读
	char* p = arr;
	printf("输出: ");
	while (*p)
	{
		if (isupper(*p))
		{
			*p = tolower(*p);
		}
		p++;
	}
	printf("%s\n", arr);
	return 0;
}

打印结果为:
在这里插入图片描述

  • 42
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值