//将输入中包含特定字符串的行打印出来
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000 /* maximum input line length*/
int getoneline(char line[], int max);
int strindex(char source[], char searchfor[]);
char pattern[] = "of"; /*pattern to search for*/
/*find all lines matching pattern*/
int main(void)
{
char line[MAXLINE];
int found = 0;
while(getoneline(line, MAXLINE) > 0)
{
printf("输入ctrl+z退出。\n");
if(strindex(line, pattern) >= 0)
{
printf("%s",line);
found++;
}
}
printf("总共有%d行。", found);
return 0;
}
/* getoneline: get line into s, return length*/
int getoneline(char s[], int lim)
{
int c, i;
i = 0;
while(--lim > 0 && (c=getchar()) != EOF && c != '\n')
s[i++] = c;
if(c == '\n')
s[i++] = c;
s[i] = '\0';
return i;
}
// /*strindex: return index of t in s, -1 if none*/
// int strindex(char s[], char t[])
// {
// 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;
// }
//练习4-1
/*strindex: return index of t in s, -1 if none*/
int strindex(char s[], char t[])
{
int i, j, k;
for(i=strlen(s)-1;i>=0;i--)
{
for(j=i,k=strlen(t)-1;k>=0 && s[j]==t[k];j--,k--)
;
if(k==(-1) && t[k+1]!='\0') //k==(-1)是保证t[]字符串比对完,t[k+1]!='\0'是保证t[]不为空 这里的k==(-1)相当于顺序比较中的t[k]=='\0' 这里的t[k+1]!='\0'相当于顺序比较中的k>0
return i;
}
return -1;
}
练习题中的代码比原来的代码多用一个strlen()函数,需要加#include <string.h>头文件。