免费网站源码,关键词优化难易,郑州 手机网站,长春火车站高清图片欢迎来CILMY23的博客喔#xff0c;本期系列为【C语言】长篇详解#xff0c;字符系列篇3-----strstr#xff0c;strtok#xff0c;strerror字符串函数的使用【图文详解】#xff0c;图文讲解各种字符串函数#xff0c;带大家更深刻理解C语言中各种字符串函数的应用本期系列为【C语言】长篇详解字符系列篇3-----strstrstrtokstrerror字符串函数的使用【图文详解】图文讲解各种字符串函数带大家更深刻理解C语言中各种字符串函数的应用感谢观看支持的可以给个赞哇。 前言 上一篇说到,有不受长度限制的字符串函数它们分别是strcpystrcatstrcmp为了方便我们想要长度限制C语言提供了三个加n的函数strncpystrncatstrncmp函数本期将了解剩下的三个字符串函数它们分别是strstrstrtokstrerror。 目录 一、strstr
二、strtok
三、strerror 一、strstr strstr函数可以在cplusplus中查到strstr - C Reference (cplusplus.com)
函数原型如下
const char * strstr ( const char * str1, const char * str2 );char * strstr ( char * str1, const char * str2 ); 函数介绍如下 返回值和使用案例 strstr的使用 strstr函数功能就是返回str2在str1中第一次出现的位置如果str2没有在str1中出现就返回NULL
#includestdio.h
#includestring.hint main()
{char arr1[] hello CILMY23;char arr2[] C;char* ret strstr(arr1, arr2);if (ret ! NULL)printf(%s \n, ret);elseprintf(找不到\n);ret strstr(arr2, arr1);if (ret ! NULL)printf(%s \n, ret);elseprintf(找不到\n);return 0;
}
结果如下 strstr的模拟实现 为了检验自己写的是否对不对我们拿出几组的测试用例
void Judge(char* p)
{if (p ! NULL)printf(%s \n, p);elseprintf(找不到\n);
}int main()
{char arr1[] hello CILMY23;char arr2[] C;char arr3[] lllC;char arr4[] This is a simple string;char arr5[] ;char* ret strstr(arr1, arr2);Judge(ret);ret strstr(arr2, arr1);Judge(ret);ret strstr(arr3, arr1);Judge(ret);ret strstr(arr3, arr2);Judge(ret);ret strstr(arr1, arr3);Judge(ret);ret strstr(arr2, arr3);Judge(ret);ret strstr(arr4, simple);Judge(ret);ret strstr(arr1, arr5);Judge(ret);return 0;
} 这组测试用例的结果是 思路一 思路解析 遍历源字符串找到与字符串2首字母相同的字符进入循环2但在进入之前需要保存一份当前位置然后我们再去利用新开辟出来的两个指针去遍历两个字符串如果有不相等的地方那么字符串肯定是走不到尾巴的也就是不可能等于\0,此时继续遍历字符串1直到字符串1遍历结束完成整个字符串的查找没有就返回NULL。 char * my_strstr(const char* str1,const char* str2)
{assert(str1 str2);char* str3 NULL;char* str4 NULL;while (*str1 ! \0){ str4 str2;str3 str1;while(*str3 *str4 *str3 *str4){str3;str4;}if (*str4 \0)return str1;str1;}return NULL;
} 逻辑图如下 代码优化 代码优化解析 1.我们并不希望在遍历字符串的时候所有的值都被修改包括我后续返回的地址所以全部都可以用const修饰 2.当我第二个字符串为空的时候返回字符串1的地址就相当于你让我在一个字符串里找什么都没有的东西库里设计是返回第一个字符串地址 3.我们不希望改变原有的地址str1和str2所以再创建一个指针变量用来代替上述str1的使用 const char* my_strstr(const char* str1, const char* str2)
{assert(str1 str2);const char* cp str1;const char* s1 NULL;const char* s2 NULL;if (*str2 \0){return str1;}while (*cp){s1 cp;s2 str2;while (*s1 *s2 *s1 ! \0 *s2 ! \0){s1;s2;}if (*s2 \0){return cp;}cp;}return NULL;
}
根据测试用例跑出来的结果如下 二、strtok
了解strtok函数之前我们要先了解一个概念相信大家都看过IP地址 计算机网络通信协议是用的IP协议于是链接进互联网的设备会有一个IP地址这个IP地址IP地址通常用“点分十进制”表示成a.b.c.d的形式 例如192.168.1.23 IP地址的本质还是一个整数因为不好记才有了点分十进制的表示方式。
那如果我们想把这个IP地址的每个数字取出来就会用到strtok这个函数。又或者你想把邮箱的域名邮箱名域名后缀取出来也会用到strtok这个函数。其中和.这种东西我们就把它称作分隔符
strtok网站以及函数原型如下
strtok - C Reference (cplusplus.com)
char * strtok ( char * str, const char * delimiters ); strtok的函数介绍 返回值和使用案例 strtok的使用 #includestdio.h
#includestring.hint main()
{char str1[] hello.CIL.MY23;char buf[60] { 0 };strcpy(buf, str1);char* p .;char* r NULL;for (r strtok(buf, p); r ! NULL; r strtok(NULL, p)){printf(%s, r);}return 0;
}
打印结果如下 strtok总结: • sep参数指向⼀个字符串定义了用作分隔符的字符集合 • 第⼀个参数指定⼀个字符串它包含了0个或者多个由sep字符串中⼀个或者多个分隔符分割的标记 • strtok函数找到str中的下⼀个标记并将其用\0 结尾返回⼀个指向这个标记的指针。注 strtok函数会改变被操作的字符串所以在使⽤strtok函数切分的字符串⼀般都是临时拷贝的内容并且可修改。 • strtok函数的第⼀个参数不为NULL 函数将找到str中第⼀个标记strtok函数将保存它在字符串中的位置。 • strtok函数的第⼀个参数为NULL 函数将在同⼀个字符串中被保存的位置开始查找下⼀个标记。 • 如果字符串中不存在更多的标记则返回NULL 指针。 三、strerror
strerror 的网址
strerror - C Reference (cplusplus.com)
函数原型
char * strerror ( int errnum );
函数介绍如下 函数的功能及使用案例 函数解析 strerror是一个返回错误码所对应的错误字符串的起始地址在C语言的库函数中设计错误码当我们库函数在调用过程中发生错误信息了要记录下来这就是错误码。是一个编码。 当库函数调用失败的时候会将错误码记录到变量errno当中errno是C语言中的一个全局变量。 strerror的使用 int main()
{int i 0;for (i 0; i 10; i){printf(%d:%s \n,i,strerror(i));}return 0;
} 结果如下