接上一篇,我们再学习四个新的字符串函数
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