在文件中查找给定的句子

时间:2013-03-08 23:06:20

标签: c function

我正在用c训练自己,我的目标是阅读文件并检查其中是否有一个给定的句子。如果文件中存在给定的句子,则该函数必须分别返回“找到”或“未找到”。 句子除以/符号。

Example of file:
1,2,3,4/
car, house, hotel/
2,age,12/
1,2/
1,2,3,5/
house, car/

Example of word to look for:
1,2/

我的想法是每次从文件中取一个句子并将其放入一个数组(称为ary)中,检查数组(ary)是否等于包含给定句子的数组(称为句子)我正在寻找,并将该数组(ary)重用于文件中的下一个句子。

我写了这段代码:

#include <stdio.h>

void main()
{
    char *sentence;
    FILE *my_file;
    char *ary;
    int size = 500;
    int got;
    int ind=0;
    int rest;
    int found=0;

    sentence="1,2";


    my_file=fopen("File.txt", "r");

    if(my_file==NULL)
    {
        printf("I couldn't open the file\n");
    }
    else
    {
        ary = (char*)malloc(500*sizeof(char));
        while((got=fgetc(my_file))!=EOF)
        {
            if(got!='/')
            {
                ary[ind++]=(char)got;
            }
            else
            {
                ary[ind++]='\0';
                rest = compare(sentence,ary);
                if(rest==0)
                {
                    found =1;
                    printf("found\n");
                    return;
                }
                ind=0;
                free(ary);
                ary = (char*)calloc(500, sizeof(char));
            }
        }
        if(found==0) 
        {
            printf("not found\n");
        }
        fclose(my_file);
    }
}




int compare(char str1[], char str2[])
{
    int i = 0;
    int risp;
    if(str1>str2 || str1<str2) 
    {
        risp=-1;
    }
    if(str1==str2)
    {
        while(str1[i++]!='\0')
        {
            if(str1[i]!=str2[i]) risp=1;
        }
    }

    return risp;
}

它编译,但不能正常工作,我不知道为什么。 有人可以指出我的错误或让我知道更好的解决方案吗?

编辑: 当我打印相对于句子的两个str是好的,但是第一个打印后的另一个继续打印,在单词前面有一个休息。如下所示:

Str1:1,2
Str2:1,2,3,4
Str1:1,2
Str2:
car, house, hotel
Str1:1,2
Str2:
2,age,12
Str1:1,2
Str2:
1,2
Str1:1,2
Str2:
1,2,3,5
Str1:1,2
Str2:
house, car

这可能是我的一个问题吗?我试着解决它......

3 个答案:

答案 0 :(得分:2)

str1和str2实际上是指针(它们指的是存储字符串的第一个元素的内存位置)。因此,使用&gt;将str1与str2进行比较和==只会比较他们的记忆位置。如果它们位于不同的位置(它们将会),则str1和str2永远不会相等。

您要做的是逐步执行str1和str2并比较值。我把它作为海报的练习。

答案 1 :(得分:1)

在C中移动字符串绝对是可行的,但它很有用,因为你真的必须理解指针和分配在幕后是如何工作的。那么我可以建议另一种不涉及移动弦的方法吗?

首先 - 让我们在psuedocode中写下如何在文件中查找字符串的定义:

def file_contains_string(file, string):
   if (file is empty):
       return "not found"
   else if (initial_part_of_file_equals(file, string)):
       return "found it!!!"
   else
       return file_contains_string(drop_first_character(file), string)

即。 “如果文件的第一部分等于字符串,则文件包含字符串,或者文件的某些后面部分等于字符串。”

以下是C:

的翻译
int file_contains_string(FILE *file, char *str)
{
    if (feof(file)) return 0;
    if (initial_part_of_file_equals(file, str)) return 1;
    fgetc(file);  /* discard leading character from the file */
    return file_contains_string(file, str);
}

现在我们如何实施initial_part_of_file_equals?好吧,如果第一个字符相等,文件的初始部分匹配,然后字符串的其余部分匹配文件的初始部分超过第一个字符:

def initial_part_of_file_equals(file, string):
   if is_empty(string):
      return True
   else if first_character(string) == first_character(file):
      return initial_part_of_file_equals(drop_first_character(file),
                                         drop_first_character(string))
   else return False

我们如何翻译?在C中,“字符串”只是指向字符数组的指针,因此只需通过前进指针即可“删除字符串的第一个字符”。并且只需通过取消引用指针来比较字符串的第一个字符。

int initial_part_of_file_equals(FILE * file, char * str)
{
    if !(str*)      return 1;  /* Test for empty string */
    if (feof(file)) return 0;  /* Test for empty file */

    char c = fgetc(file);      /* get first character from file */

    int result = (c == *str)
                 && initial_part_of_file_equals(file, str++);

    ungetc(c, file);

    return result;
}

ungetc中的str很重要 - 如果只有{{1}}的第一个部分匹配,我们要确保我们实际上不会消耗相应的部分输入流。

答案 2 :(得分:1)

慢慢地,我自己找到了一个解决方案。 我知道这不是优雅的,但对我来说这是一个小小的胜利。

char c;
char str[]="1,2/";
FILE * f;
int i=0; 

f=fopen("File.txt", "r");
if (f==NULL) perror ("Error opening file");
else
{
   while ((c=(char)fgetc(f)) != EOF) {
      if((c==str[i]))  {
          if (c=='/')
            {
              printf("FOUND\n");
              return;
            }
          i++;
      }
      else i=0;
      if(c=='/')
          i=0;
    }
    printf("NOT FOUND\n");
    fclose (f);
  }