2

フラットファイルから行を取得する必要があるプログラムを書いています。次に、行をスキャンしてデータを構造体に入れます。これは私に非常に予想外の結果をもたらします。まず、これは私がやりたいことに似た実用的な例です。次のようなファイル department.in があります。

0 something
1 else
2 more

これが実行され、期待する結果が得られるプログラムの例です。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{

    FILE *in;
    in = fopen("department.in", "r");

    char * buffer = malloc(256 * sizeof(char));
    while((fgets(buffer, 256, in)) != NULL){

            int index;
            char* name;
            sscanf(buffer, "%d %s", &index, name);

            printf("\n\nIndex: %d, Name: %s.\n\n", index, name);
    }

    free(buffer);

    return 0;
}

予想通り、これの結果は次のとおりです。

Index: 0, Name: something.

Index: 1, Name: else.

Index: 2, Name: more.

ただし、構造体を追加すると、正常にコンパイルされます。

#include <stdio.h>
#include <stdlib.h>

typedef struct{
    int index;
    char* name;
}test;

int main(void)
{

    FILE *in;
    in = fopen("department.in", "r");

    char * buffer = malloc(256 * sizeof(char));
    while((fgets(buffer, 256, in)) != NULL){

            test *mytest = malloc(sizeof(test));

            sscanf(buffer, "%d %s", &mytest->index, mytest->name);

            printf("\n\nIndex: %d, Name: %s.\n\n", mytest->index, mytest->name);
            free(mytest);
    }
    free(buffer);
    return 0;
}

結果は私が期待するものではありません:

Index: 0, Name: (null).

Index: 1, Name: (null).

Index: 2, Name: (null).

明らかに、私は自分のチャーで何か間違ったことをしていますが、私の人生では何がわからないのですか。特定のものを変更すると、障害が発生することさえあります。どんな助けでも大歓迎です!

PS これは宿題ではありません。ここで読みやすく、コンパイルしやすくするために、また必要なこの概念を学ぶために、実際のコードのはるかに単純化された例を作成しました。再度、感謝します!

4

1 に答える 1

2

にストレージを割り当てますmytest->name。出力は、ポインターが NULL であることを示しています。

mytest->name = malloc(256); /* sizeof(char) is always 1, by definition */

または、ポインターを配列に置き換えることができます。

typedef struct{
    int index;
    char name[256];
}test;

ところで、単純化された例を作成するのは良い仕事です。

于 2013-04-26T00:39:47.590 に答える