2

我正在用 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 时,可以,但第一次打印后的另一个 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

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

4

3 回答 3

2

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

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

于 2013-03-08T23:12:30.330 回答
1

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

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

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

于 2013-03-09T16:18:29.640 回答
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);
  }
于 2013-03-10T17:30:59.440 回答