100 Days of Code-day28-查找模式-自主实现strstr函数功能
查找模式的具体功能如上一篇所示。
#include#define MaxSize 100int getline(char *s, int maxlen);const char* mystrstr(const char *str1, const char *str2);int main(int argc, char *argv[]){ int found = 0; char line[MaxSize]; if (argc != 2) printf("Usage:find pattern\n"); else { while (getline(line, MaxSize) > 0) { if (mystrstr(line, argv[1]) != NULL) { printf("%s", line); found++; } } } printf("%d", found); return found;}int getline(char *s,int maxlen){ char c; char *temps = s; while (-- maxlen > 0 && (c = getchar())!=EOF && c != '\n') {//--maxlen是为了给换行符留出空间 *s++ = c; } if (c == '\n') *s++ = c; *s = '\0'; return s - temps;}const char * mystrstr(const char *s1, const char *s2){ int i, j, k, len2, count = 0; for (len2 = 0; *(s2 + len2) != '\0'; len2++) ; //len2 becomes the length of s2 for (i = 0; *(s1 + i) != '\0'; i++) { if (*(s1 + i) == *s2) { for (j = i, k = 0; *(s2 + k) != '\0'; j++, k++) { if (*(s1 + j) == *(s2 + k)) count++; else count = 0; if (count == len2) { return s1 + i; } } } } return NULL;}
mystrstr的灵感来源:https://stackoverflow.com/questions/3850241/my-strstr-returning-null-even-if-the-string-to-be-found-is-at-the-index-0
对上述mystrstr函数进行修改之后,使其结构更加紧凑。
const char *mystrstr(const char *s1, const char *s2){int i, len, count = 0, j, k;for (len = 0; *(s2 + len) != '\0'; len++);for (i = 0; *(s1 + i); i++){for (j = i, k = 0; *(s2 + k) && *(s1 + j) == *(s2 + k); j++, k++)count++;if (k == 0 || *(s2 + k))count = 0;if (count == len)return s1 + i;}return NULL;}