模拟实现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; else return 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; }运行结果如下: