使用getdelim填充2d数组,在循环内部工作但不在外部

时间:2012-08-24 00:25:25

标签: c

所以我有一段代码可以读取包含10列和5行数字/字母对的文本文件。我填充并读取一个二维数组,例如

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

是什么给出了?

2 个答案:

答案 0 :(得分:4)

您需要为数组gridline缓冲区提供声明。

无论如何,你很可能指的是数组中每个元素的相同line缓冲区。当你&#34;填充&#34;在第一个循环中你的数组,你只打印最近初始化的元素,这会产生一切错觉&#34; working&#34;正常。但是当你真正尝试重新验证阵列的内容时,幻觉就会崩溃。

尝试在第一个循环中打印一些先前初始化的元素,您将看到第一个循环也不起作用:所有先前初始化的数组元素似乎具有相同的值,并且该值将在每次迭代时更改。

答案 1 :(得分:0)

我说行是char *类型,每次使用getdelim写入地址时,你都在改变值而不是引用...实际上,所有grid [i] [j]指向相同的字符串,因此产生的行为

尝试malloc'ing和strcpy'ing到循环中的每个网格[i] [j]

grid[i][j] = (char*)malloc(3);
strcpy(grid[i][j], line);