СИ Считать из файла слова и записать их в структуру
Нужно считать текст из файла, разделить его на отдельные слова и записать в уже имеющуюся структуру Моя проблема в том, что при записи в структуру я получаю на выходе дубликаты последнего словa. Как переписать программу, чтобы она работала корректно??
Заранее спасибо!
Моя программа:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "my_list.h"
#include <ctype.h>
#define N 81
void main() {
my_list *list = my_list_init(); //выделяю память для моей структуры
FILE *src = fopen("C:\\c\\first_in.txt", "r");
char str[N]; // N = 81
int i = 0;
char m[15];
while (fgets (str,N,src) != NULL){
char *token = strtok(str, " \n\t?!.,;:()");
char *mp =strcpy(m,token);
while (token != NULL) {
my_list_insert(list,mp,i); //добавляю в мою структуру
token = strtok(NULL," \n\t?!.,;:()");
i++;
}
}
for (size_t k = 0; k < i; k++) { ///вывожу данные структуры
printf("%s\n",(char*)(my_list_get(list,k)));
}
}
Файл first_in txt:
A
very
short
example
Вывод который я получаю:
example
example
example
example
Ответы (1 шт):
По всей видимости, в своей структуре вы храните только указатели на строку, которые ей передаете. А передаете вы один и тот же указатель на строку
char m[15];
которую перезаписываете.
Либо меняйте принцип своего списка и храните в нем само слово, а не указатель, либо передавайте каждый раз новый указатель, получая его, например, с помощью strdup(). Только не забывайте потом, по окончании работы, освобождать выделенную этой функцией память.
И еще - из каждой строки вы многократно берете только первое слово, остальные игнорируя:
while (token != NULL) {
my_list_insert(list,mp,i); //добавляю в мою структуру
token = strtok(NULL," \n\t?!.,;:()");
i++;
}
Вы всякий раз добавляете все то же самое первое слово - mp, просто игнорируя новые значения token - их вы никуда не копируете и не вносите.
И еще - все же, как по мне, бывают слова и длиннее 14 символов...