Я новичок в C и путаюсь с указателями и массивами char ...

Я написал это:

char *read(char *filename) {
    char *text[1000];
    FILE *inputFile = fopen(filename, "r");
    int i=0;
    while (feof(inputFile)) {
        text[i++] = fgetc(inputFile);
    }
    text[i]='\0';
    fclose(inputFile);
    return text;
}

Моя цель - передать имя файла, который я хочу открыть, открыть его и присвоить все слова в нем массиву символов (char text []). Я постоянно получаю ошибки относительно:

"выражение, значение которого равно нулю, обрабатывается как константа нулевого указателя типа 'char *' [-Wnon-literal-null-conversion]"

"несовместимые типы указателей, возвращающие 'char * [1000]' из функции с типом результата 'char *' [-Wincompatible-pointer-types]"

Ищу любой совет.

0
BluVuze 11 Окт 2021 в 18:46

2 ответа

Лучший ответ

У вас здесь две проблемы.

Сначала ваш массив объявляется как char *text[1000];, то есть массив указателей на char, поэтому каждый text[i] является указателем, а не символом. Вероятно, вы хотели char text[1000];.

Затем это приводит ко второй проблеме: вы возвращаете указатель на локальную переменную. Этот указатель становится недействительным, когда функция возвращается, поэтому попытка его использования вызовет неопределенное поведение.

Вместо этого вы должны динамически распределять память:

char *text = malloc(1000);

Таким образом, он все еще будет действителен, когда функция вернется. Имейте в виду, что вам понадобится free память, когда вы закончите ее использовать.

В качестве альтернативы вы можете передать буфер для заполнения в качестве аргумента функции:

void read(char *filename, char *text) {
2
dbush 11 Окт 2021 в 16:00

Вы хотите заполнить массив символов символами, прочитанными из файла. Если это так, то, по крайней мере, вам нужно объявить массив символов, например

char text[1000];

Вместо массива указателей на символы, как вы писали

char *text[1000];

Однако объявленный массив имеет автоматическую продолжительность хранения и не будет активен после выхода из функции. Таким образом, возвращенный указатель будет недействительным.

Вы должны размещать массив динамически, например,

char *text = malloc( 1000 );

Также вам необходимо проверить, успешно ли открылся файл.

Условие в цикле while

while (feof(inputFile)) {
    text[i++] = fgetc(inputFile);
}

Может произойти после вызова fgets. В результате в массиве может храниться недопустимый символ.

Ты должен написать

for ( int value; i + 1 < 1000 && ( value = fgetc( inputFile ) ) != EOF; i++ ) 
{
    text[i] = value;
}
0
Vlad from Moscow 11 Окт 2021 в 16:01