本篇主要介绍3个库函数
一、strstr字符串查找
二、strtok字符串切割
三、strerror返回错误码,打印错误类型
四、perror(和strerror功能类似)
strstr
1.1 strstr---查找字符串函数 (在一个字符串里面查找是否包含另一个字符串)
存在返回第一次出现的地址,不存在返回空指针
1.2 char* strstr (const char* , const char* ) ;
1.3 strstr 的使用
int main()
{
char arr1[] = "abbcdef";
char arr2[] = "bbc";
char* ret = strstr(arr1, arr2);
if (NULL == ret)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
1.4 实现my_strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);//断言
//先创建变量
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;//创建变量cp,方便回头查找
//那如果查找的是空字符串怎么办,考虑全
if (*s2 == '\0')
{
return (char*)str1;
}
//开始查找
while (*cp)
{
//赋值
s1 = cp;//都指向第一个字符
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))//查找进入的条件是两个字符都不是'\0'
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;//如果没找到,则返回str1的下一个字符继续查找
//写完之后还要再修改一下,为了更加优化
//都找完了还没有找到,要返回空指针
}
return NULL;
}
在查找字符串的时候,我们可能会碰到"abbbcdef","bbc" 这种情况,隐含了"bbc",所以在查找字符串的时候,需要代码能够实现回头查找的功能(上述代码),cp的存在就是实现回头查找的功能
strtok
2.1 1)sep参数是个字符串,定义了用作分隔符的字符串集合
2)第一个参数指定了一个字符串,它包含了0个或多个由sep字符串中一个或者多个分隔符分割的标记
3)strtok的使用共有( n + 1 )次调用,第一次调用传参为 :临时拷贝字符串,分隔符标记的字符集合(sep);随后n次调用传参为:NULL,分隔符标志的字符集合(sep)
4)strtok函数在第一次调用的时候,找到str中第一个标记,保存它在字符串中的位置,在以后n次调用中,strtok函数将在同一个字符串中被保存的位置开始查找下一个标记,如果找不到,返回NULL(为什么以后n次传参为空指针,因为已经返回指向这个标记的地址了)
5)strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容,并且要可修改
2.2 char* strtok (char* str , const char* sep) ;
2.3 strtok的使用
int main()
{
char arr[] = "I love china !";
char* p = " ";//空格为分割标志
char tmp[30] = { 0 };
strcpy(tmp, arr);//拷贝一份,用它来分割
char* ret = NULL;
//写成循环形式来实现自己的结束
for (ret = strtok(tmp, p); ret != NULL; ret = strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
strerror
3.1 在调用库函数失败时,都会设置错误码(C语言设置好的),strerror会返回错误码所对应的错误信息
头文件为#include <errno.h>和#include <string.h>
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
printf("%s\n", strerror(6));
printf("%s\n", strerror(7));
printf("%s\n", strerror(8));
printf("%s\n", strerror(9));
printf("%s\n", strerror(10));
return 0;
}
3.2 strerror的使用
int main()
{
//打开文件失败的时候,返回NULL
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
//读文件
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
3.3 perror
头文件为#include <stdio.h>
int main()
{
//打开文件失败的时候,返回NULL
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
perror("fopen");
return 1;
}
//读文件
//关闭文件
fclose(pf);
pf = NULL;
return 0;
}
1.首先把错误码转化为错误信息
2.打印错误信息(包含了自定义的信息)
对比strerror:
strerror是把错误码转化为错误信息,要打印需加上printf打印,而perror自带打印,且包含自定义信息