问题
【问题描述】
从文件中查找包含给定字符串的行。
【输入形式】
从标准输入中分两行分别输入被查找的文件及要查找的字符串(中间不含空格)。
【输出形式】
在屏幕上输出文件中包含给定字符串的行。
【样例输入】
在键盘输入如下文件名及字符串:
test.txt
the
文件test.txt内容如下:
Now is the time
for all good
men to come to the aid
of their party
【样例输出】
屏幕输出为:
this is the time
men to come to the aid
of their party
算法分析
设 int index ( char s[ ], char t[ ] )函数用来在字符串s中查找字符串t。若找到则反回t在s中出现的位置,否则返回-1。其主要查找算法如下:
for(i=0; s[i] != '\0'; i++)
for(j=i,k=0; t[k] != '\0'; j++,k++)
s[j]和t[k]进行比较 //不同时break;找到的条件是:t[k]==‘\0’
主要算法如下:
设变量filename,s,line分别用于存储文件名、查找串及文件中一行;
从标准输入中读入文件名和要查找的串到filename和s中;
以读方式打开文件filename;
while 文件中还有内容时读一行到line中
如果 index(line, s) >= 0
输出line;
算法实现
#include <stdio.h>
#define MAXLINE 1000
int index(char s[ ], char t[ ]);
int main( )
{
char filename[64], s[81], line[MAXLINE];
FILE *fp;
scanf("%s", filename);
scanf("%s", s);
if((fp = fopen(filename, "r")) == NULL){
printf("Can't open file %s!\n", filename);
return 1;
}
while(fgets(line, 81, fp) != NULL)
if(index(line, s) >= 0)
printf("%s", line);
return 0;
}
int index(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(t[k] == '\0')
return ( i);
}
return ( -1);
}