模拟实现strchr,strrchr,strstr,strrstr函数

来源:互联网 发布:小清新记账软件 编辑:程序博客网 时间:2024/05/22 13:41

                            模拟实现strchr,strnchr,strstr,strrstr函数

strchr

查找字符串s中首次出现字符c的位置,返回首次出现c的位置的指针,如果s中不存在c则返回NULL

#include<stdio.h>#include<string.h>#include<iostream>#include<assert.h>char *Is_strchr(char *str, char a){assert(str != NULL);while (*str){if (*str == a){return str;}else*str++;}return NULL;}int main(){char arr[20] = "abcdedef";char b = 'c';char *ret;ret = Is_strchr(arr, b);printf("%s\n",ret);system("pause");return 0;}

strrchr

strrchr() 函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回NULL

#include<stdio.h>#include<string.h>#include<iostream>#include<assert.h>char *Is_strrchr(char *str, char a){assert(str != NULL);char *p = str;while (*p){*p++;}while (*p != *(str-1)){if (*p == a){return p;}else*p--;}return NULL;}int main(){char arr[20] = "abcdecdef";char b = 'c';char *ret;ret = Is_strrchr(arr, b);printf("%s\n",ret);system("pause");return 0;}


大家可以看出两者的区别。

strstr

strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 NULL。

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>char *My_strstr(char *dst,char *str){assert(str != NULL);assert(dst != NULL);char *s = dst;                   char *q = str;char *p = s;while (*p){p = s;                 q = str;while ((*p != '\0') && (*q != '\0')){if (*p++ == *q++){;}else{s++;                  break;}}if (*q == '\0'){ return s;                    }}return NULL;}int main(){char *s1 = "Hello world!";char *s2 = "el";char *ret =My_strstr(s1, s2);if (ret == NULL){printf("sorry,Do not find!\n");}printf("%s\n", ret);system("pause");return 0;}

运行结果如下:



strrstr

strrstr() 函数搜索一个字符串在另一个字符串中最后一次出现。和strstr相似,该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 NULL。
可以将第一次出现的地方找到,继续找,将地址改成下次出现的地址。
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<assert.h>char *My_strrstr(char *str1, char *str2){assert(str1&&str2);char *last = NULL;char *start = str1;int j = 0;while (*str1&&*str2){start = str1;while (*str1&&*(str2 + j) && *str1 == *(str2 + j)){str1++;j++;}if (*(str2 + j) == '\0'){last = start;                //将上次找到的地址修改成本次的地址}str1 = start + 1;j = 0;}if (*str1 == '\0')return last;elsereturn NULL;}int main(){char *s1 = "abcdeabcde";char *s2 = "abc";char *ret = My_strrstr(s1, s2);if (ret == NULL){printf("sorry,Do not find!\n");}printf("%s\n", ret);system("pause");return 0;}

运行结果如下:


原创粉丝点击