填充动态分配的字符串数组?

我有以下代码来填充字符串数组,但每次更改值时,整个数组都会更改(而不是单个字符串数组)

那是因为你是与数组所有位置的char相同的指针。

当你这样做时:

words[i] = txt; 

您正在分配指针。 所以每个word[i]都是相同的字符串( txt )。 如果你真的想把这个单词读入缓冲区(比如txt )然后把它放到字符串数组中,你需要将缓冲区字符串的内容复制到数组中的字符串,如下所示:

 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]); } 

您需要为每个单词分配空间并将字符串复制到此分配的空间:

 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。 因此,在操作结束时,您有许多指向同一缓冲区的指针,其中包含一个字符串。