переменная нарушения прав чтения - PullRequest
0 голосов
/ 27 декабря 2018

Когда я использую char* pilih(char teks[]) в функции int main(), это работает.Но когда я использовал эту функцию в новой функции, она сказала нарушение прав чтения.Пожалуйста, помогите мне

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define MAXARR 1000
char *hilangkan(char[]);
char *pilih(char[]);
char *loadFile(FILE *sumber);

int main(){
    FILE *sumber;
    sumber=fopen("kumpulan.txt","r");
    char *teks=loadFile(sumber);
    char *pilihan=pilih(teks);
    printf("%s",pilihan);
    printf("%s",hilangkan(pilihan));
}

char *hilangkan(char teks[]){
    char *penghilangan;
    strcpy(penghilangan,teks);
    int y=strlen(penghilangan);
    srand(time(NULL));
    int c=48;
    for(int i=0;i<y;i++){
        int hilang=rand()%y+1;
        penghilangan[hilang]='_';
    }
    return penghilangan;
}
char *loadFile(FILE *sumber){
    char *teks;
    if (sumber == NULL) {
        printf("ERROR!!!");
        system("pause");
        return 0;
    }
    char h;
    int count=0;
    while (h = fgetc(sumber) != EOF) { 
        teks[count] = h; 
        count++;
    }
    fclose(sumber);
    return teks;
}
char *pilih(char teks[]){
    char *hasil;
    srand(time(NULL));
    int w = rand() % 47 + 1;
    char cek[3];
    itoa(w, cek, 10);
    char *c=strstr(teks, cek);
    int lokasi = c - teks + 1;
    int pan = strlen(cek);
    int i;
    if (pan == 2)i = -1;
    else i = 0;
    while (teks[lokasi]!='\n') {
        hasil[i] = teks[lokasi];
        i++;
        lokasi++;
    }
    hasil[i] = NULL;
    return hasil;
}

На while(teks[lokasi]!='\n') написано доступ к нарушению чтения.teks было 0x1110113

1 Ответ

0 голосов
/ 27 декабря 2018

Ссылки крайне нежелательны, и от вас ожидается, что вы должны опубликовать всю программу в своем вопросе.
Из той части кода, которую вы опубликовали, и информации об ошибке, кажется, что аргумент передан *Функция 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 динамически распределяется память, как только вы закончите с этим.

Я не то, что именно выпытаюсь сделать, но где-то я чувствую, что в вашем коде есть множество улучшений.

Надеюсь, эта помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...