1

テキスト ファイルを読み取り、int および string ポインターを介して構造体に割り当てる C プログラムを作成しました。

これが私のプログラムのコードスニペットです:

i = 0;
while(!feof(phoneBook)) {
    fscanf(phoneBook, "%d|%s\n", &num, fname);
    info[i].phone_num = num;
    printf("%d\n", info[i].phone_num);
    info[i].first_name = fname;
    printf("%s\n", info[i].first_name);

    i++;
    ctr++; 
    printf("\nfirst:%s", info[0].first_name); 
    printf("\nsecond:%s", info[1].first_name);
    printf("\nthird:%s\n\n", info[2].first_name);       
}

最初の繰り返しで、最初の行を info の 0 インデックスに割り当てます。2 回目の反復では、2 行目をインデックス 1 に割り当て、インデックス 0 を置き換えます。

テキスト ファイルには次の行のみが含まれています (テスト用)。

出力は次のとおりです。

//first iteration
first:first
second: <null>
third: <null>
//second
first:second
second: second
third: <null>
//third
first:third
second: third
third: third

ちなみに、私は自分の構造を次のように宣言しました。

typedef struct{
    int id;
    char *first_name;
    char *last_name;
    int phone_num;
} phone_det;

phoneBook はデータ型 phone_det で宣言されています。

どんな形の助けも大歓迎です!私は C を使い始めたばかりで、ポインターについてはまだ少し混乱することがあります。:(

4

6 に答える 6

2

構造体を見ることはできませんが、ポインターを毎回同じ名前バッファーに割り当て、名前バッファー自体を特定の配列にコピーしないため、同じ名前バッファーへの多くの異なるポインターが作成されます。

于 2013-06-30T04:28:19.857 に答える
0

すべてのコードを見ることができないため、これは推測ですが、これらの項目に char * があるに違いありません。つまり、ポインターを文字列に割り当てているということです。

fname実際にはバッファです。(おそらくchar fname [20])したがって、各アイテムは、読み取りごとに変更されるものを指してfnameいます。

この問題を解決するには、構造体に配列を含めます。次に、strcpyまたはを使用strncpyして fname からコピーします。

于 2013-06-30T04:28:35.993 に答える