Ссылки крайне нежелательны, и от вас ожидается, что вы должны опубликовать всю программу в своем вопросе.
Из той части кода, которую вы опубликовали, и информации об ошибке, кажется, что аргумент передан *Функция 1002 * недопустима, что, в свою очередь, указывает на указатель teks
, указывающий на недопустимую память.Фактическая причина проблемы может быть указана только после просмотра минимальной, полной и проверяемой программы, изображающей проблемное поведение.
Одна из проблем подтверждения в вашей функции pilih()
заключается в том, что вы возвращаете из нее локальную переменную hasil
.Область действия и срок службы локальной переменной hasil
ограничены функцией pilih()
и больше не действительны после выхода из функции pilih()
.
Также этот оператор
hasil[i] = NULL;
неправильно.Переменная hasil
является массивом char
, а hasil[i]
является символом с индексом i
.Вы присваиваете ей NULL
, что недопустимо.Я думаю, что вы хотели сделать это:
hasil[i] = '\0';
РЕДАКТИРОВАТЬ:
Полный код был опубликован в вопросе.Поэтому редактирую мой ответ и указываю на проблемы в коде OP.
В вашем коде есть несколько проблем.Если вы используете gcc
компилятор, попробуйте скомпилировать ваш код с опциями "-Wall -Wextra" и проверьте сообщения с предупреждениями, выданные компилятором.
В функции loadFile()
посмотрите на это утверждение:
while (h = fgetc(sumber) != EOF) {
Прежде всего, тип возврата функции fgetc()
равен int
, а не char
[тип возврата fgetc()
равен int
для размещения специального значения EOF
] .В таблице приоритетов операторов оператор !=
стоит перед =
, поэтому вы не получите символ чтения, назначенный для h
, а результат fgetc(sumber) != EOF
будет присвоен h
.Это должно быть
while ((h = fgetc(sumber)) != EOF) { // check the parenthesis added
^ ^
В этом операторе:
teks[count] = h;
Вы получаете доступ к указателю, который не инициализирован. Любая переменная, которая не инициализирована, имеет неопределенное значение, и то же самое верно для указателей. Они могут указывать на любой случайный неопределенный адрес.Нет поведения по умолчанию.Только поведение является неопределенным, и использование неопределенных значений приводит к неопределенному поведению .
Вы должны выделить память для teks
перед ее использованием, например:
teks = malloc(100 * sizeof (char)); //this will allocate memory for 100 characters.
if (teks == NULL)
exit(EXIT_FAILURE);
Выглядиткак вы хотите сохранить все содержимое файла в teks
.Обязательно выделите достаточно памяти для teks
, и если вы не уверены в размере требуемой памяти, realloc
ваш друг.
Кроме того, после цикла while
вы должны добавить завершающий нольсимвол в конце содержимого, сохраненного в teks
, например:
teks[count] = '\0';
Та же ошибка доступа к неинициализированному указателю существует в функциях hilangkan()
и pilih()
.Проверьте переменные penghilangan
и hasil
соответственно.
strstr()
может вернуть указатель NULL
.Вы должны добавить проверку для этого:
char *c=strstr(teks, cek);
if (c == NULL)
return NULL; // Or whatever the way you want to handle this case
// but you should not use c
Вы должны проверить значение параметра перед использованием его в каждой функции.Если это указатель, проверьте, является ли он NULL
или нет.Если это не NULL
, используйте только его.
Кроме того, убедитесь, что free
динамически распределяется память, как только вы закончите с этим.
Я не то, что именно выпытаюсь сделать, но где-то я чувствую, что в вашем коде есть множество улучшений.
Надеюсь, эта помощь.