在文件中打印子字符串

时间:2014-10-19 21:26:09

标签: c arrays io

所以我想编写一个程序,打印出一个包含文件中某个单词的文本行。例如如果我正在寻找一个单词' linux'它会打印出来

  

2台计算机名为linux00,linux01和linux02。

5经理,"   说linux00。 "你好linux00,"说

7在这看到我们?"说过   linux01。 "那么,"说了

10 linux02。 "你将会成为一切   拔出时,#&34;说

12 goooooooooooo ..."说linux00。

来自story.txt的

  

曾几何时,有三台小型

计算机被调用   linux00,linux01和linux02。

有一天,好的电脑经理   进入了

Linux实验室。 "你好漂亮的电脑

经理,"   说linux00。 "你好linux00,"说好的电脑经理。

  "是什么让你

在这里看到我们?"说linux01。 "那么,"说   

很好的电脑经理,"我有坏消息,

我很好   。新闻#&34; "什么是坏消息?"说

linux02。 "你将会成为一切   拔出时,#&34;说好的电脑经理。

"什么是   

goooooooooooo ..."说linux00。

这是我的代码:

#include<stdio.h>
#include <stdlib.h>
#define ARR_LEN 100

 int getLine(FILE * fin,char a[],int n)
{
   int find = contains("linux", 5, a, ARR_LEN);
   int count;
   int i;
   i = 0;
   char c = getc(fin);
      while(c != '\n')
   {
    a[i] = c;
    // printf ("%c", a[i]);
    //i = 0;

     if (a[i] == EOF){
        return EOF;
    }

    if (find == 1)
    {
           printf("%c", c);
           c = getc(fin);

    }
    i = i + 1;
   }
    if(a[i]=='\n')
    {
           if ((i - 1) > ARR_LEN) {
        printf("warning msg: length is over array bounds\n");
     }
    // printf("length of line is: %d\n", i - 1);
    //printf("%c", a[i]);
     i = i + 1;
    //printf("\n");
    return i - 1;



   }
}
int contains(char target[], int m, char source[], int n) {
    int flag = 0; // the source originally does not contain the target
    int i;

  for(i = 0; i < n; i++) { // go through each character of the source string
    int targetIndex = 0;
    int j;
            /*check if the preceding characters of the source string are a substring
            that matches the target string*/
    for(j = i; j < n && targetIndex < m; j++) {
        if(target[targetIndex] == source[j]) {
            targetIndex += 1;
            if(targetIndex == m) { // the 'target' has been fully found
                flag = 1;
                break;
            }

        }
        else
        {
            break;
        }
    }
    if(flag == 1)  // 'target' is already found, no need to search further
    {
      break;
    }
}

return flag;
}



    main(int argc,char ** argv)
{
    setbuf(stdout,NULL);
    char a[ARR_LEN];
    FILE * fin;
    if(argc<2){
      printf("wrong number of arguments\n");
      exit(0);
    }
    fin = fopen(argv[1], "r");
    if (fin == NULL) {
    printf("Cannot open %s\n", fin);
    exit(0);
    }
   int t = 0;
   int j = 0;
   int find = contains("linux", 5, a, ARR_LEN);
    while (j != EOF)
{
    t = t + 1;
    printf("%d ", t);
    j = getLine(fin,a,ARR_LEN);
    printf("\n");
}
    fclose(fin);
}

getLine函数没问题,它打印出一个前面有行号的文本都很好。但问题在于这个

if (find == 1)
    {
           printf("%c", c);
           c = getc(fin);

    }

部分,我希望程序只打印出行,如果&#34;包含&#34;在该行中找到匹配项。

感谢您提供任何帮助&amp;抱歉很长的帖子!!

1 个答案:

答案 0 :(得分:0)

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    int main()
    {
      char sentence[500];
      char word[10] = "linux";
      FILE* fp1 = fopen("strstr.txt","r");
      if(fp1 == NULL)
      {
         printf("Failed to open file\n");
         return 1;
      }
      while((fscanf(fp1,"%[^\n]\n",sentence)>0))
      {
          if(strstr(sentence,word)!=NULL)
          printf("%s\n\n",sentence);
      }
    }