Я пытаюсь динамически выделить слова прямо из txt-файла для дальнейшего использования, но после ввода имени файла программа вылетает и возвращает отрицательное значение (CodeBlocks). Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define L 18
#define F 50
int main()
{
char **text = NULL;
int wcount=0;
text = textInput(&wcount);
free(text);
return 0;
}
char** textInput(int *wcount)
{
FILE *loadfile;
char fname[F];
char *word;
char **text;
printf("\nType the file of the name you would like to load: ");
scanf("%49s", fname);
strcat(fname, ".txt");
if ((loadfile = fopen(fname, "rt")) == NULL)
perror("Cannot open file");
while(fscanf(loadfile,"%18s", word = (char*)malloc(L*sizeof(char)))!= EOF)
{
(*wcount)++;
text = (char**)realloc(text, (*wcount)*sizeof(char *));
text[(*wcount)-1] = word;
}
fclose(loadfile);
free(word);
return text;
}
Какова ценность F?
мой плохой, я думал, что C# был подходящим тегом для c
забыл добавить все строки #include и #define
Используйте свой отладчик. Шаг через код. Первый шаг: ВЫ ДОЛЖНЫ ОПРЕДЕЛИТЬ КОНКРЕТНУЮ ЛИНИЮ, В КОТОРОЙ НЕИСПРАВНА. Вам нужно точно знать, что какая дает сбой (какая строка) и, в идеале, Зачем (например, нарушение сегментации). Использование отладчика является хорошим способом сделать это.
Ошибка на единицу: "%18s" должно быть "%17s", но с "%49s" все получилось.
Отвечает ли это на ваш вопрос? Отладка ошибки сегментации в программе C
будьте осторожны с fname. Хорошо, что вы думаете о том, чтобы оставаться в рамках с %49s, но потом вы идете и пристегиваете .txt к этому. Если пользователь превысит 49, произойдет переполнение.
спасибо за советы, я решил проблему, оказывается, я пропустил инициализацию текстового указателя, как указывает первый ответ





В функции textInput вы не инициализировали text перед вызовом realloc(text, ...).
Добавьте инициализацию text = NULL перед вызовом realloc. Например.
char **text = NULL;
У вас уже есть такая строка в main(), но в main() это не имеет значения, переменная text в main() не совпадает с переменной text в textInput(). (Кроме того, в main() вы переназначаете text, прежде чем пытаться его использовать, поэтому инициализация text в NULL не требуется.)
Черт, кажется, проблема была в этом, большое спасибо, что указали на это, нужно было изучить это подробнее.
Не могли бы вы отредактировать вопрос, указав тег используемого вами языка, а не C#?