1

私はファイルを読んで、その中に与えられた文があるかどうかをチェックするために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;
}

コンパイルされますが、正しく動作せず、理由がわかりません。

もっと簡単な別の解決策を試しましたが、うまくいきません。

void main()
{
    char sentence[]="1,2";
    FILE *my_file;
    char string[2000];
    int ind=0;
    int rest;
    int trovato = 0;
    int got;

    my_file=fopen("File.txt", "r");
    if(my_file==NULL)
          printf("I couldn't open the file\n");
    else
    {
        string[0]='\0';
        while((got=fgetc(my_file))!=EOF)
        {
            if(got!='/')
            {
                string[ind++]=(char)got;
            }
            else
            {
                string[ind++]='\0';

                rest = compare(sentence, string);
                if(rest==0)
                {
                    found =1;
                    printf("found\n");
                    return;
                }
                ind=0;

                //delete the array
                int x=0;
                while(string[x]!='\0')
                {
                    string[x]='\0';
                    x++;
                }

            }
        }
        if(found==0) printf("not found\n");


        fclose(my_file);
    }
}

誰かが私の間違いを指摘したり、より良い解決策を教えてもらえますか?ありがとうございました。

4

4 に答える 4

2

これが宿題だと仮定すると、文は別々の行にあり、「/」で終わることが保証されていますか?

この場合は、getline 関数を使用してから、strcmp を使用する必要があります。

于 2013-03-09T05:06:31.220 に答える
2

最初のコードに関しては、compare 関数が間違っています。

これらのチェックは意味がありません。代わりに strcmp を使用できます (またはポインターを比較しないでください)。

  if(str1>str2 || str1<str2) 
  {
    risp=-1;
  }
  if(str1==str2)

第二に、新しい文の後に改行を追加している/ため、決して等しく比較されません。これを while ループの先頭に追加します。

if (got == '\n') continue;
于 2013-03-09T05:12:17.450 に答える
1

比較機能が機能するはずだと思う理由が正確にはわかりません。2 つの配列を比較する場合は、それらの開始アドレスを比較しません。また、関数をプログラムに統合する前に、まず他のデータでテストしてください。

配列 A[10] を B[10] と比較したい場合はchar* Achar* Bとそれint sizeを入力として受け取る関数を作成し、時間を実行するループを介して A の各要素を B と比較しますsize

于 2013-03-09T08:07:09.673 に答える
0

もちろん、compare文字列ではなくポインターを比較しているため、機能しません (ポインターが等しい場合を除きます。これは、各文字をテストせずに文字列が等しいことを保証できる 1 つのケースです)。そのアドレスにあるコンテンツの等価性を判断する上で、アドレスにはどのような意味がありますか? なし。

stringまたはary配列を本当に使用する必要がありますか? 2 つの ではなく、 aと acompareで動作する関数を考えてみましょう。FILE *char *char *

FILE *fileとの 2 つの引数を取りchar *sentenceます。size_t offset = 0;他の比較関数と同様に、 から始めます。(から)文字を取得するたびにfgetc(file)、それを と比較しsentence[offset]ます。一致する場合は、インクリメントoffsetして繰り返します。の場合sentence[offset] == '\0'、不一致なしで文末に到達しました。これは、文を見つけたという意味ではありませんか? 一致しない場合は、一致しない文字を ( を使用してungetc) 元に戻し、「不一致」に対応する値を返します。

初心者はアルゴリズムを過度に複雑にする傾向があります。-肩をすくめる-

于 2013-03-09T05:30:37.800 に答える