东阳实惠营销型网站建设厂家网站建设与推广协议书

当前位置: 首页 > news >正文

东阳实惠营销型网站建设厂家,网站建设与推广协议书,东莞seo外包超联seo,上海哪里有网站建设C语言函数#xff1a; 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用#xff1a;字符串查找。在一串字符串中#xff0c;查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char*的指针 原理#xff1a;如果在str1中找到了str2…C语言函数 字符串函数及模拟实现strtok()、strstr()、strerror() strstr()函数: 作用字符串查找。在一串字符串中查找另一串字符串是否存在。 形参: str2在str1中寻找。返回值是char的指针 原理如果在str1中找到了str2则返回在str1中存在的str2的字符串的第一个字符的地址。如果在str1中每找到str2则返回NULL(空指针)。 举例: #define _CRT_SECURE_NO_WARNINGS#include stdio.hint main() {char arr1[] abcdefgh;char arr2[] bcde;char arr3[] bcdeh;char a1 strstr(arr1, arr2);char* a2 strstr(arr1, arr3);return 0; } a1是在arr1中寻找arr2,在arr1[1]~arr1[4]上找到了与arr2一样的字符串则返回arr1中字符b的地址。 a2是在arr1中寻找arr3,在arr1中并未找到与arr1一样的字符串则返回NULL。 #define _CRT_SECURE_NO_WARNINGS#include stdio.hint main() {char arr1[] abcdefgh;char arr2[] bcde;char arr3[] bcdeh;char* a1 strstr(arr1, arr2);char* a2 strstr(arr1, arr3);if (a1 ! NULL){printf(arr2找到了);//结果:arr2找到了}if (a2 NULL){printf(arr3没找到);//结果:arr3没找到}return 0; } strstr()函数的模拟实现 char* my_strstr(const char* str1, const char* str2)//因为两个地址值不会改变所以加const {assert(str1 str2);//防止两个参数为NULLchar* pt1 NULL;char* pt2 NULL;char* nc str1;//用于在字符串中找到与str2首元素一样字符。while (*nc)//当str1中找完了都没有找到和str2中首元素一样的字符时停止循环。{pt1 nc;//用于定位到每次找到和str2中首元素一样的字符的地址。pt2 str2;//用于指向str2的首元素地址。while (*pt1 *pt2 ( * pt1 *pt2))//找到和str2中首元素一样的字符{pt1;pt2;}if (pt2 \0)//当上面的循环走完ptr2的指向\0时说明在str1中找到了和str2一样的字符串{return nc;//返回当时的字符串。}nc;//当这个str1中的元素和str2不匹配就要看下一个字符是否匹配。}return NULL; } int main() {char arr1[] abbcdef;char arr2[] bcd;char a1 my_strstr(arr1, arr2);if (a1 ! NULL){printf(arr2找到了\n);//结果:arr2找到了}else{printf(arr2没找到\n);}return 0; }补充还有一种算法KMP算法。也是一个字符串查找的算法。 strtok()函数: 作用对字符串进行切分分割 #include string.h 参数 str是将被分割的字符串 sep是需要传入的是字符串sep内包含了需要作为分割符的字符的集合 如果要将str中分为三个部分www、qq、com 那么就需要在和.处进行分割。因此和.就是分割符将分隔符放入sep字符串中此时就是 分割符的字符的集合 原理 这里有个字符串str wwwqq.com\0 strtok()会将按照sep所指示的在str中寻找sep内存在的字符。 找到后会将改成\0。 strtok()返回之前的字符串的首元素地址即str中第一个w的地址。 并且strtok会记录此时\0的位置。 strtok有两种机制 1.如果strtok不为NULL那么会保存的位置(会被改成\0)      2.如果strtok为 NULL,那么会从上次strtok所保存的位置继续往下找seq中的字符如果找到接着分割。最后再保存被改成\0的位置。 最后如果strtok找到了没被改的\0也就是字符串末尾的\0时返回NULL。 那么有疑问了strtok是怎么保存的位置呢 其实想要保存某个数据实际上就是创建一个全局变量。只要创建了全局变量程序运行到哪里无论在哪个函数中都可以被使用。 因此strtok就是利用全局变量的能力从而保存了的位置。那么strtok是怎么保存的呢难道直接在代码中写上一个全局变量吗显然不是。 strtok其实是使用static修饰了存放位置的变量因为static基本含义就是让一个变量成为全局变量。 static函数名除了对该函数声明的文件可见外其他文件都无法访问。也就是只能被本文件中的函数调用而不能被同一程序中的其他文件的函数调用。 static可以限定变量或函数为静态存储。静态函数会被自动分配在一个一直使用的存储区直到程序结束才从内存消失static限定的变量或函数不会和同一程序中其他文件同名的相冲突。如果用static限定内部变量则该变量从程序一开始就用有内存不会随其所在函数的调用和退出而分配和消失。 #define _CRT_SECURE_NO_WARNINGS#include stdio.h #include assert.hvoid cc() {static int opp 0;opp;printf(%d, opp); }int main() {cc();//结果:1int opp 3;cc();//结果:2return 0; } 使用建议 因为strtok的会对str字符串本身进行修改如果不想对strtok进行修改时可以用strcpy进行拷贝然后对拷贝的字符串使用strtok char arr[] wwwqq.com;char* p .;char tmp[20] { 0 };strcpy(tmp, arr);//拷贝 实验 #define _CRT_SECURE_NO_WARNINGS#include stdio.h #include assert.h #include string.hint main() {char arr[] wwwqq.com;char* p .;char tmp[20] { 0 };strcpy(tmp, arr);char* ret NULL;ret strtok(tmp, p);printf(%s\n, ret);//wwwret strtok(NULL,p);printf(%s\n, ret);//qqret strtok(NULL, p);printf(%s\n, ret);//comret strtok(NULL, p);printf(%s\n, ret);//(null)return 0; }创建了一个ret用于存放每次strtok返回的字符串首元素地址。 第一次调用 strtok(tmp, p)拿到了(返回)w的地址保存了(\0)的位置。 第二次调用strtok(NULL,p)拿到了(返回)q的地址保存了.(\0)的位置。 第三次调用strtok(NULL,p)拿到了(返回)c的地址\0的位置。 第四次调用strtok(NULL,p)拿到了(返回)NULL,这是因为\0后面找不到p内包含的字符了。 结果打印三个部分www、qq、com 代码强化 这一个一个地调用strtok显然是不合理地。 并且我们发现除了第一次调用strtok传入地第一个参数是一个活指针之外后面的几次调用使用的都是NULL因此我们可以创建一个循环从而分割它们。 #define _CRT_SECURE_NO_WARNINGS#include stdio.h #include assert.h #include string.hint main() {char arr[] wwwqq.com;char* p .;char tmp[20] { 0 };strcpy(tmp, arr);char* ret NULL;for ( ret strtok(tmp, p); ret ! NULL; ret strtok(NULL, p)){printf(%s\n, ret);}return 0; } for(初始化值;判断条件;对值改变) 初始化值执行了strtok第一次调用。 判断条件如果为strtok返回了NULL说明没有分隔符了for循环就停止。 对值改变做到了除第一次以外后n次地对strtok地调用。 模拟实现 C语言源码剖析与实现——strtok()系列函数实现_strtok源码_CG的博客-CSDN博客 strerror 作用翻译错误码。在使用库函数的时候如果失败了都会出现错误码而这串错误码你完全不懂是什么意思比如5这个错误码的意思是什么呢肯定不知道吧。 错误码的作用是告诉你你的代码执行过程中出现的错误。比如内存空间不足等等… 参数 头文件#include string.h strerror返回的是一个地址这个地址指向了一个字符串。这个字符串就是strerror从错误码所翻译出来的一句话。 #define _CRT_SECURE_NO_WARNINGS#include stdio.h #include assert.h #include string.h #include errno.hint main() {printf(%s\n, strerror(0));printf(%s\n, strerror(1));printf(%s\n, strerror(2));return 0; } 除此之外还有许多C语言内部的错误码。 errno: errno是C语言定义的一个全局变量它的作用是存放代码执行过程中出现的错误码。 它不需要人为的定义当用到它的时候只需要引头文件#include errno.h 举例 #define _CRT_SECURE_NO_WARNINGS#include stdio.h #include assert.h #include string.h #include errno.hint main() {//fopen:打开文件FILE* pf fopen(test.txt, r);//test.txt不存在if(pf NULL)//fopen找不到test.txt会返回空指针printf(%s\n, strerror(errno));//返回错误信息return 0; } 模拟实现: 单纯的翻译代码因此不做实现。