0

私は C を初めて使用しますが、使用するパラメーターに応じてファイルから行を返す関数を作成しようとしています。そのパラメータを含む最後の行を返します。例を使用して説明する方が良いと思います:

ファイルの内容は次のとおりです。

1 one onehello
2 two twohello
3 one threehello

したがって、次のように関数を呼び出すと:

lineContaining("one")

「one threehello」を返す必要があります

これが私がこれまでに持っているものです。関数をテストするメイン関数も含まれています。

char *readStringedCommand(char *str1)
{
    int size = 1024;
    char *buffer = malloc(size);
    char *result = malloc(size);
    FILE *fp;
    fp = fopen("test.txt", "r");
    while(fgets(buffer, 1024, fp)) //get a line from a file
    {
            printf("while1 entered: %s", buffer);
            int i = 0;
            int j = 0;
            int k = 0;
            while(buffer[i] != '\n') //read all the way to the end of a line
            {
                    printf("while2 entered: %s", buffer+i);
                    k = i;
                    while(buffer[k]==str1[j]) //while two characters match
                    {
                            printf("while3 entered");
                            k++;
                            j++;
                            strcat(result, buffer+k); //append the character to the result

                            if(str1[j] = '\0') //if the next character of str1 is the last one
                            {
                                    strncat(result, buffer+k, 20); //append the rest of buffer to the result
                                    return result;
                                    printf("result = %s", result);
                            }
                    }

                    result[0] = '\0'; //clear result for the next line
                    j = 0; //set str1's position to 0
                    k = 0;
                    i++;
            }

    }
    return "errorrrrrr";
}

int main(int argc, const char* argv[])
{
    int num1 = 1;
    char str1[] = "one onehello";
    int num2 = 2;
    char str2[] = "two twohello";
    int num3 = 3;
    char str3[] = "one threehello";
    hwrite(num1, str1); //a function I made that writes a line to a file
    hwrite(num2, str2);
    hwrite(num3, str3);
    printf("%s", readStringedCommand("one"));
    return 0;
}

さて、関数は私にエラーを与えます:

while1 entered: 1 one onehello
while2 entered: 1 one onehello
while2 entered:  one onehello
while2 entered: one onehello
Segmentation fault (core dumped)

3番目のwhileループでエラーが発生することを考えると、問題があると思います。残念ながら、ここで何が問題なのかわかりません。その時点以降、さらにエラーがあると確信していますが、これは私を混乱させています。

私の質問:

  1. このセグメンテーション エラーを修正するにはどうすればよいですか?
  2. コードは明らかに非常に醜いですが、私は C が苦手です。この問題を解決するためのより良い方法はありますか?

これをすべて読んでくれてありがとう。助けていただければ幸いです。=(

編集:皆さんから提案されたいくつかのエラーを修正した後、セグメンテーション エラーが発生しなくなりました。関数は代わりに "onehello" を返しますが、これは間違っています。「one threehello」を返す必要があります。しかし、私は進歩を遂げており、そのことに感謝しています。

4

2 に答える 2

2
if(str1[j] = '\0')

する必要があります

 if(str1[j] == '\0')

おそらく値を比較したいでしょう

while(buffer[i] != '\n')ファイルに改行文字がない場合、ループが終了しない可能性があります。これは、.txt ファイルの最後の行で発生する可能性があります。

于 2013-04-27T20:44:13.920 に答える