在上篇我们了解了部分字符函数及字符串函数,下面我们来看剩下的字符串函数.
strstr 的使用和模拟实现
老规矩,我们先了解一下strstr这个函数,下面看下这个函数的函数原型.
char * strstr ( const char * str1, const char * str2);
如果没找到就返回NULL指针.
下面我们看下它的使用.
#include <string.h>
int main()
{
char arr[20] = "hello bit bit abc";
char* p = strstr(arr, "bit");
printf("%s\n", p);
p = strstr(arr, "ab");
printf("%s\n", p);
return 0;
}
代码执行结果如下
在了解了他的功能之后我们尝试着实现一下这个函数.(我们先用暴力算法去实现,如果对kmp算法感兴趣的话可以看下 博客).
char* strstr(const char* str1, const char* str2)
{
if (!str1 || !str2)
{
return NULL;
}//str1或str2为空返回空
char* p1 = str1;
char* p2 = str2;
char* cur = str1;
while (*cur)
{
while (*p1 == *p2)
{
if (*p1 == '\0')
{
return cur;//找的字符串与原字符串相同
}
p1++;
p2++;
}
if ((*p2) == '\0')
{
return cur;//找到字符串了,且二者不完全相同
}
p1 = ++cur;
p2 = str2;
}
return NULL;//没找到
}
int main()
{
char arr[20] = "hello bit bit abc";
char* p = strstr(arr, "bit");
printf("%s\n", p);
p = strstr(arr, "ab");
printf("%s\n", p);
char arr1[20] = "hello";
p = strstr(arr1, "hello");
printf("%s\n", p);
return 0;
}
在写函数时一定要将各种情况考虑清楚.
strtok 函数的使用
还是先看函数原型
char * strtok ( char * str, const char * sep);
这个函数通常用于分割一段字符串. 下面看下函数使用:
#include<string.h>
int main()
{
char p[100] = "/Users/Adolbook/Documents/WeChat%20Files/wxid";;
char* str = NULL;
char* d = "/";
for (str = strtok(p, d); str != NULL; str = strtok(NULL, d))
{
printf("%s\n", str);
}
return 0;
}
strerror 函数的使用
函数原型:
char * strerror ( int errnum );
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明 的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动 的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应 的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。
我们通过下面的代码先简单的认识一下错误信息
#include <errno.h>
#include <string.h>
int main()
{
int i = 0;
for (i = 0; i <= 10; i++) {
printf("%s\n", strerror(i));
}
return 0;
}
输出结果见下:
下面来看一下使用的举例
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n", strerror(errno));
return 0;
}
好啦,今天的复习就进行到这里.大家晚安~