Это потому, что у вас одинаковый указатель на char для всех позиций массива.
Когда вы делаете:
words[i] = txt;
Вы назначаете указатель. Таким образом, каждый word[i]
является одной и той же строкой (txt
).
Если вы действительно хотите прочитать слово в буфер (например, txt
) и затем поместить его в массив строк, вам необходимо скопировать содержимое строки буфера в строку в массиве, например:
strncpy(words[i], txt, MAX_WORD_LENGTH);
Существует также другая проблема с вашим кодом, которая заключается в распределении массива строк.
Должно быть:
words = (char**)malloc(wordcount * sizeof(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]);
}