我有以下代码来填充字符串数组,但每次更改值时,整个数组都会更改(而不是单个字符串数组)
答案 0 :(得分:4)
那是因为你是与数组所有位置的char相同的指针。
当你这样做时:
words[i] = txt;
您正在指定一个指针。因此,每个word[i]
都是相同的字符串(txt
)。
如果你真的想要将单词读入缓冲区(如txt
)然后将其放入字符串数组中,则需要将缓冲区字符串的内容复制到数组中的字符串,如下所示: / p>
strncpy(words[i], txt, MAX_WORD_LENGTH);
您的代码还存在另一个问题,即字符串数组的分配。 它应该是:
words = (char**)malloc(wordcount * sizeof(char*));
这是因为字符串数组是指向char指针(char**
)的指针,并且数组的每个元素都是一个字符串(char*
)。现在你已经分配了一个char指针数组,但你还没有为每个字符串分配内存,这就是我们接下来要做的事情:
for (i = 0; i < wordcount; i++) {
words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
}
如果你不想使用缓冲区并直接读入字符串数组,你的代码将是这样的:
words = (char**)malloc(wordcount * sizeof(char*));
input = fopen(filename, "r");
while(!feof(input)) {
words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
fscanf(input, "%s", words[i]);
}
答案 1 :(得分:1)
您需要为每个单词分配空间并将该字符串复制到此分配的空间:
input = fopen(filename, "r");
while(!feof(input)){
if(fscanf(input,"%s", txt)){
/* malloc for word here */
words[i] = malloc(strlen(txt)+1);
strcpy(words[i], txt); //<---Problem line right here
++i;
}
}
答案 2 :(得分:0)
这段代码的问题在于您已经分配了一个缓冲区来接收来自fscanf的字符串数据。每次从文件中读取字符串时,都会将其放在txt缓冲区中。单词数组中的每个指针指向txt。所以在操作结束时,你有许多指向同一个缓冲区的指针,它包含一个字符串。