#include<stdio.h>
#define MAXLINE 1000//最大行长度
//函数声明
int getline(char s[], int lim);
int strindex(char s[], char t[]);
char pattern[] = "could";//待寻找的字符串
int main()
{
char line[MAXLINE];
int found = 0;
while (getline(line, MAXLINE) > 0)
if (strindex(line, pattern) >= 0) {
printf("%s", line);
found++;
}
return (found);//返回匹配数目
}
//保存字符串行到数组s中,返回该行长度i;主调函数中,当行长度大于0则执行循环
int getline(char s[], int lim)//对应实参char line[MAXLINE],MAXLINE
{
int c, i;
i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c != '\n')
s[i++] = c;//先赋值后自增,区别于s[++i]
if (c == '\n')
s[i++] = c;
s[i] = '\0';//空字符,标志字符串的结束
return (i);//返回该行的长度
}
//比较待查找字符串t[k]与输入字符串,返回t在s中的位置,若未查找到则返回-1;
主调函数若查找到则打印输出,反之不打印
int strindex(char s[], char t[])//对应实参line,pattern
{
int i, j, k;
for (i = 0; s[i] != '\0'; ++i) {
for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; ++j, ++k)
;
if (k > 0 && t[k] == '\0')
return (i);
}
return (-1);
}
仔细观察strindex函数不难发现,该函数只要找到带寻找字符串t在字符串s中第一次出现的位置(从左向右遍历,最左边的位置)就结束循环;对strindex稍作修改,使该函数在找到字符串t之后不结束,而是继续向右匹配,知道结束。这样这个函数则实现了返回t在s中最后一次出现的位置。
代码如下:
int strindex(char s[], char t[])//对应实参line,pattern
{
int i, j, k, pos;
pos = -1;//pos记录待查字符串t出现的次数,若未查找到t,则返回初值-1
for (i = 0; s[i] != '\0'; ++i) {
for (j = i, k = 0; t[k] != '\0' && s[j] == t[k]; ++j, ++k)
;
if (k > 0 && t[k] == '\0')
pos = i;
}
return (pos);
}