我有以下代码来填充字符串数组,但每次更改值时,整个数组都会更改(而不是数组中的单个字符串)
这是因为对于数组的所有位置,您都是指向char的同一指针。
当你这样做:
words[i] = txt;
您正在分配一个指针。因此,每个单独的word[i]
都是相同的字符串(txt
)。如果您真的想将单词读取到缓冲区(如txt
)中,然后将其放入字符串数组中,则需要将缓冲区字符串的内容复制到数组中的字符串中,如下所示:
strncpy(words[i], txt, MAX_WORD_LENGTH);
代码还有另一个问题,那就是字符串数组的分配。应该是:
words = (char**)malloc(wordcount * sizeof(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]);
}
您需要为每个单词分配空间,并将字符串复制到这个分配的空间:
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;
}
}
这段代码的问题是,您分配了一个缓冲区来接收来自fscanf的字符串数据。每次从文件中读取字符串时,都会将其放在txt缓冲区中。单词数组中的每个指针都指向txt。因此,在操作结束时,有许多指针指向同一个缓冲区,该缓冲区包含一个字符串。