查找模式的具体功能如上一篇所示。
#include<stdio.h>
#define MaxSize 100
int 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;
}