首页 > 其他分享 >小新喊你了解字符串函数了(二)

小新喊你了解字符串函数了(二)

时间:2024-03-17 22:58:06浏览次数:23  
标签:NULL 函数 strtok char 字符串 include 小新

接上一篇,我们再学习四个新的字符串函数

1.strstr函数的使用和模拟实现

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

strstr函数用于字符串的查到,在一个字符串中查找另一个字符串,找到了就返回字符串str2在字符串str1中第⼀次出现的位置 ,找不到就会返回NULL(空指针),注意找不到的时候不能以空指针的形式打印出来。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	 char str1[] = "This is a simple string";
	 char str2[] = "is";
	 char* cp = strstr(str1, str2);
	 if (cp != NULL)
	 {
		 printf("%s\n", cp);//is is a simple string
	 }
	 else
	 {
		 printf("找不到\n");
	 }
	return 0;
}

小新:请看模拟版

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

char* my_strstr(const char* str1, const char* str2)
{
	const char* sur = str1;//记录每次查找的起始位置,方便找不到的返回该位置,再从下一个位置查找
	const char* s1 = NULL;//初始化
	const char* s2 = NULL;
	if (*str2 == '\0')//如果str2给的是空字符串
	{
		return (char*)str1;
	}
	while (*sur)
	{
		s1 = sur;
		s2 = str2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)//相等就继续往下找
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)sur;//找到了
		}
		sur++;
	}
	return NULL;//没找到
}

int main()
{
	char str1[] = "This is a simple string";
	char str2[] = "is";
	char* cp = my_strstr(str1, str2);
	if (cp == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", cp);//is is a simple string
	}
	return 0;
}

2.strtok函数的使用 

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

strtok函数的作用可以简单的理解为切割字符串,以分隔符为标志把源字符串切割成几份。

注意:sep参数指向一个字符串,定义了用作分隔符的字符集合

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

           strtok函数找到在str中的作为分隔符的符号,并将其以'\0'结尾,返回一个指向这个标记的指             针

            strtok函数的第一个参数不为空指针,函数找到str中的第一个标记,strtok函数将会报春它              在源字符串中的位置

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

            如果源字符串不存在更多的标记,则会返回空指针

小新用代码来说明会好理解一些。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	char str[] = "[email protected]";
	const char* sep = "@.";
	char* ret = NULL;
	ret = strtok(str, sep);//xiaoxin
	printf("%s\n", ret);
	ret = strtok(NULL, sep);//xiaokui
	printf("%s\n", ret);
	ret = strtok(NULL, sep);
	printf("%s\n", ret);//xiaobai
	return 0;
}

上面的代码我们在优化一下

int main()
{
	char str[] = "[email protected]";
	const char* sep = "@.";
	char* ret = NULL;
	//循环初始条件                 循环控制条件     循环转化条件
	for (ret = strtok(str, sep); ret != NULL; ret = strtok(NULL, sep))
	{
		printf("%s\n", ret);
	}
	//利用for语句的特性,来对代码进行优化
	return 0;
}

3.strerror函数的使用 

char * strerror ( int errnum );

strerror函数可以把参数部分对应的错误信息的字符串的地址返回来

在不同的系统和C语言标准库的现实中规定了一些错误码,一般放在<errno.h>这个头文件中说明的,C语言程序启动的时候会使用一个全面的变量来记录程序中当前的错误,只不过程序在刚启动的时候errno是0,表示没有错误,但当我们使用标准库中的函数又出现了某种错误的时候,就会将对应的错误码存放在errno中,而一个错误码的数字又很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。strtok函数就能将错误信息的字符串的地址返回来。

下面我们拿Windows11+VS2022的环境举例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	int i = 0;
	for (i = 0; i <= 15; i++)
	{
		printf("%-2d :%s\n", i,strerror(i));
	}
	return 0;
}

举个例子:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<errno.h>
#include<string.h>

int main()
{
	//fopen以读的形式打开文件,如果文件不存在,就打开失败
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件

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

 

4.perror函数的使用

void perror ( const char * str );

perror函数要比strtok函数好用一些,要想大错误打印出来,strerror函数要找printf来帮忙,而perror不需要,自带打印功能。这里要注意的是在使用perror函数的时候要给函数传参,如果不知道传什么就可以传空字符串,但不能不传。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{
	//fopen以读的形式打开文件,如果文件不存在,就打开失败
	FILE* pf = fopen("text.txt", "r");
	if (pf == NULL)
	{
		perror("xiaoxin");
		return 1;
	}
	//读文件

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

 


到这里字符串函数就结束了,快来和小新一起来丰富自己吧~

后面应该会系统的更新指针和内存函数的内容,小新在努力学习和肝稿中~

 

标签:NULL,函数,strtok,char,字符串,include,小新
From: https://blog.csdn.net/Zhihuiguoz/article/details/136788754

相关文章

  • 代码随想录算法训练营第十天|LeetCode 20.有效的括号、1047.删除字符串中的所有相邻重
    20.有效的括号题目链接:https://leetcode.cn/problems/valid-parentheses/description/解题思路:题目转化:三种类型的括号,需要做匹配匹配规则是:左右括号的类型要匹配、数量要一致,而且要按照顺序匹配例子是:“()”、“(){}[]”、“(([]))”条件转化:按照顺序匹配:......
  • 一.函数的递归
    简单而通俗易懂的说,函数的递归就是:函数自己调用自己。就是把大事化小事,递的意思就是推进的意思。归就是回归的意思。递归的限制:两个条件:1.递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。                        ......
  • 学了 Python 但又感觉没学 Python 不如重学 Python - day2(基础内置函数与变量引用的详
    目录1、int函数2、bin、oct、hex 函数3、type函数4、complex函数5、布尔运算6、chr与ord函数7、max与min函数8、eval函数9、变量对象引用10、对象的垃圾回收11、变量命名规则12、序列赋值13、增强赋值1、int函数按n进制将整数字符串转换为......
  • [C语言]——函数
    一.函数的概念数学中我们其实就见过函数的概念,⽐如:⼀次函数y=kx+b,k和b都是常数,给⼀个任意的x,就得到⼀个y值。其实在C语言也引⼊函数(function)的概念,有些翻译为:子程序,子程序这种翻译更加准确⼀些。C语言中的函数就是⼀个完成某项特定的任务的一小段代码。这段代码是有特殊......
  • 求字符串中某个字符的数量--long k = s.chars().filter(ch -> ch == c).count();
    classSolution{publiclongcountSubstrings(Strings,charc){longk=s.chars().filter(ch->ch==c).count(); //Java中的count()方法返回值是基本数据类型longreturnk*(k+1)/2;}}作者:灵茶山艾府链接:https://leetcode.cn/pr......
  • [Python初阶]2255.统计是给定字符串前缀的字符串数目
    目录     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析③.startswith()方法理解与说明Ⅰ.定义和用法 Ⅱ.语法 ④.问题解决⑤总结     2255.统计是给定字符串前缀的字符串数目①.题目②.问题分析需求:统计列表words中,是字......
  • 统计字符串字符个数
    importjava.security.Key;importjava.util.Scanner;importjava.util.Set;importjava.util.TreeMap;publicclassMain{publicstatic<scanner>voidmain(String[]args){System.out.println("请输入一个字符串");Scannersc=newScanne......
  • 19笔试真题:看程序写结果,含有内嵌对象的类的构造函数调用次序
    看程序写结果,含有内嵌对象的类的构造函数调用次序#include<iostream>usingnamespacestd;classStudent1{public:Student1(){cout<<"Student1+"<<endl;}~Student1(){cout<<"-Student1"<<endl;}};classStudent......
  • 递归示例-展开编号(Excel函数集团)
    展开编号=DROP(fx(COUNTA(B:B)-1),1)fx=LAMBDA(x,IF(x>0,VSTACK(fx(x-1),SEQUENCE(INDEX(Sheet4!$B:$B,x+1),,INDEX(Sheet4!$C:$C,x+1)))))使用Lambda定义x当x小于等0时,返回False,以此作为开关;当x为1时,返回False连接SEQUENCE(INDEX(Sheet4!$B:$B,2),,INDEX(Sheet4!$C:......
  • abc324E 合并两字符串后能
    给定n个字符串s[n]和字符串t,从中任选一对下标(i,j),要求i<=j,让s[i]与s[j]连起来得到一个新的串,要求由新串删除0个或多个字符可以得到t,问存在多少对满足条件的下标对?1<=n<=5e5;1<=len(s[i]),len(t)<=5e5假设由字符串x能得到t的前缀长度为a,字符串y能得到t的后缀长度为b,如果a+b>=le......