【发布时间】:2017-11-02 18:22:23
【问题描述】:
我需要将文件中的一系列单字行加载到数组中,因此我创建了一个函数来执行此操作。该函数将char*** arr 作为参数,它是一个指向字符串数组的指针。我分配内存然后让这个循环将单词加载到数组中。
i=0;
FILE *fp = fopen(filename, "r");
while(fgets(tok, WORD_BUFFER, fp) != NULL){
(*arr)[i] = tok;
printf("Word %d:%s", i, (*dict)[i]);
i++;
}
//arr is a char***, tok is a char[WORD_BUFFER], and WORD_BUFFER is 50
我的问题是,这似乎是用我试图输入到条目 [i] 的任何内容覆盖数组的每个条目。我这样说是因为上面循环的输出文件看起来像这样:
A
B
C
D
似乎打印正确,但是当我在主函数中打印数组时(甚至只是在那个函数的后面),它会打印出来:
D
D
D
D
我猜这与我对fgets 的使用或(*arr)[i] = tok 的分配有关,但我不确定。
谢谢!
【问题讨论】:
-
此语句后 (*arr)[i] = tok ;数组的所有元素都具有相同的变量 tok 的值,
-
这是为什么呢?为什么不只让 arr[i] 有 tok 的值呢?
-
您只是在使用
=运算符进行指针赋值。tok在循环中每次迭代都会被文件中的内容覆盖。所以一切都指向tok,这是从文件中读取的最后一行。如果您想保存数据,每次循环时都需要将strcpy来自tok的数据发送到不同的目的地。 -
@yano 谢谢!使用 strcpy 有效。我有点困惑,为什么一个简单的指针分配不起作用,因为我相信我在以前的一些工作中已经做到了,没有问题,但是,非常感谢!
-
当然
arr必须有足够的空间来存储数据,如果没有,当您strcpy并写入您不拥有的内存时,您会调用未定义的行为。这可能表现为段错误