Поместите данные из файла в массив в C

вот мой код.

#include  #include  int main() { //Vars FILE *fp; char word[9999], *arrayOfWords[9999]; int wordCount = 0, i; //Actions fp = fopen("data.txt", "r"); if(fp != NULL) { while(!feof(fp)) { fscanf(fp, "%s", word); arrayOfWords[wordCount] = word; wordCount++; } for(i = 0; i < wordCount; i++) { printf("%s \n", arrayOfWords[i]); } puts(""); } else { puts("Cannot read the file!"); } return 0; } 

Я пытаюсь прочитать некоторые данные из текстового файла и сохранить его в массиве. Все в порядке, пока я нахожусь в цикле, но когда я выхожу оттуда, любое значение любого индекса в моем массиве заполняется последним словом файла. Может ли кто-нибудь помочь мне узнать ошибки, которые я совершаю?

Файл данных:

 Hello there, this is a new file. 

Результат:

 file. file. file. file. file. file. file. file. 

Любая помощь будет оценена!

В вашем коде есть по крайней мере 2 вопроса. char word[9999], *arrayOfWords[9999]; определяет arrayOfWords как массив char pointers на 9999 char pointers . Это одна из проблем.

Еще один момент – arrayOfWords[wordCount] = word; , Здесь, чтобы сохранить вновь прочитанное слово, вам нужно выделить пространство, поскольку arrayOfWords – это массив указателей. Пожалуйста, найдите измененный код, как показано ниже.

 int main() { //Vars FILE *fp; char arrayOfWords[30]; int wordCount = 0, i; //Actions fp = fopen("data.txt", "r"); if(fp != NULL) { while(!feof(fp)) { fscanf(fp, "%s", &arrayOfWords[wordCount]); wordCount++; } puts(""); for(i = 0; i < (wordCount - 1); i++) { puts(arrayOfWords[i]); } puts(""); } else { puts("Cannot read the file!"); } return 0; } 

Вам нужно выделить память для каждого отдельного члена вашего массива (используя malloc или путем предоставления второго измерения массива и объявления его типа char вместо char* ). То, что вы делаете, похоже на:

 char *s; scanf("%s", s); 

И это не может работать на C Фактически здесь у вас UB (неопределенное поведение), потому что указатель не инициализирован.

EDIT: вы получаете все поля в массиве, чтобы вместо этого указывать на свое word массива, после того как вы прочитали слово, вы должны выделить новую память для строки, а затем strcpy в нее word strcpy .

Это:

 arrayOfWords[wordCount] = word; 

не копирует текущее слово в отдельное хранилище, он просто присваивает другому указателю указание на тот же кусок памяти, что и у этого word . Таким образом, вы получаете массив указателей на один и тот же массив word . Вам нужно отдельно выделять память для каждого слова и копировать символы, составляющие каждое слово (и терминатор NULL), а не указатель.