0

そのため、10 列 5 行の数字と文字のペアを含むテキスト ファイルを読み取るコード スニペットがあります。たとえば、2次元配列にデータを入力して読み取ります

for (i = 0; i < 5; i++) {
    for (j = 0; j < 10; j++) {

        getdelim(&line, &len, ' ', fp);
        grid[i][j] = line;
        printf("%s ", grid[i][j]);

    }   

    printf("\n");
}

出力は次のようになります。

12 9F H2 FQ 0M CH RD XC W8 4D

VT C8 TM ZQ 0E PQ D1 2J YD KK

XY P5 AW 4Y 41 05 6E HW F2 QQ

YF R5 JV 4N 7F 4J V1 9K MM 0M

CT RF RM WV C6 V9 P6 TW WX MX

しかし、別の for ループで配列の要素を再読み込みすると、次のようになります。

for (i = 0; i < 5; i++) {
    for (j = 0; j < 10; j++) {

        printf("%s ", grid[i][j]);

    }   

    printf("\n");
}

配列内のすべての要素について、配列内の最後の要素を取得します。

MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX MX
MX MX MX MX MX MX MX MX
MX MX MX MX
MX MX MX
MX MX MX MX

何を与える?

4

2 に答える 2

4

grid配列とlineバッファの宣言を提供する必要があります。

lineとにかく、配列の各要素から同じバッファを参照している可能性が最も高いです。最初のサイクルで配列を「設定」すると、最後に初期化された要素のみが出力され、すべてが正しく「機能している」という錯覚が生じます。しかし、実際に配列の内容を再検証しようとすると、幻想は崩壊します。

最初のサイクルで以前に初期化された要素を出力してみてください。最初のサイクルも機能しないことがわかります。以前に初期化された配列要素はすべて同じ値を持つように見え、その値は反復ごとに変化します。

于 2012-08-24T00:35:38.907 に答える
0

行は char* 型であり、getdelim を使用してそのアドレスに書き込むたびに、参照ではなく値を変更していると思います...実際には、すべての grid[i][j] が指している同じ文字列、したがって結果の動作

ループ内の各グリッド[i] [j]にmalloc'ingとstrcpy'ingを試してください

grid[i][j] = (char*)malloc(3);
strcpy(grid[i][j], line);
于 2012-08-24T00:37:51.983 に答える