我试图做一个简单的程序,使用scanf将标准输入中的字符串读入并放入字符串数组中(现在我只是使用它进行测试3个单词,因此最后只有3个打印语句)。我能够继续阅读,直到没有更多的字符串,但是我遇到了一个错误,在循环完成后,数组中的所有字符串都是最后一个读入的字符串。我试着把一个print语句放在循环进行调试,并且正在读取正确的字符串。但是,当循环结束时,数组中的所有字符串都是最后一个读入的字符串。有谁能指出我在哪里出错吗?谢谢。使用scanf将字符串读取到字符串数组中
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int c = 0;
char** w_arr = malloc(3*sizeof(char*));
char* w = malloc(10*sizeof(char));
while (scanf("%s", w) == 1) {
w_arr[c] = w;
//printf("%s", w_arr[c]); debug print statement
c++;
}
printf("%s, %s, %s\n", w_arr[0], w_arr[1], w_arr[2]);
return 0;
}
您需要'malloc'一个新的'w'缓冲每'scanf'(或得到一个新的缓冲液如某种其他方式'w_arr并[c] =的strdup(W)')。就像这样,所有数组条目都指向同一个缓冲区,其内容被每个scanf所覆盖。 – kaylum
啊。对不起,我是新来的c。所以基本上,我所有的数组中的条目都不是指向一个字符串,而是指向一个指针。所以当循环完成时,它们都指向相同的指针,这是最后一个字符串的地址? – PCR
@PCR它不是“字符串的地址” - 它是内存中某个空间的地址。然后你读入该空间的第一个字符串,并使'w_arr [0]指向该空间。然后你读第二个字符串进入该空间,并让'w_arr [1]'指向那个空间。然后你读入第三个字符串,并使'w_arr [2]'指向那个空间。最终结果是'w_arr [0]','w_arr [1]'和'w_arr [2]'都指向该空间,并且该空间包含第三个字符串(因为您覆盖了前两个字符)。 – immibis