Нужна помощь при сканировании содержимого файла в массив указателей

#c #arrays #pointers #input

#c #массивы #указатели #ввод

Вопрос:

Мне нужно прочитать файл, в каждой строке файла содержится одна строка (длиной не более 50 символов), и мне нужно сохранить каждую строку в массив указателей. Итак, если файл читает:

 1234
abcd
5667
...
  

Тогда массив (называемый функциями) был бы *functions[0] = 1234, *functions[1]= abcd и так далее…

Я попробовал несколько вещей, и, похоже, у меня не совсем получается заставить это работать. Это начало моего кода или, по крайней мере, части, относящиеся к моей путанице:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 201            /* 200 is th emax number of lines in the file*/
#define MAX_FUNCTION_LENGTH 51    /* each line is at ax 50 characters long

main() {
    char func[MAX_FUNCTION_LENGTH]
    char * functions[MAX_SIZE]      /* this is my ragged array*/    
    FILE * inf;
    inf =fopen("list.txt", "r");
  

Я пробовал несколько способов, но мне не удается заставить * функции сохранять значения должным образом. Кто-нибудь может мне помочь? 🙂

Комментарии:

1. Вы пробовали инициализировать с помощью malloc()?

2. да, я пытался это сделать, проблема в том, что обычно я просто заполняю каждый указатель либо последней, либо первой строкой в зависимости от используемого метода

Ответ №1:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 201

int main( int argc, char **argv ) {
    FILE *fp = fopen ( "D:\personal\input.txt","r");
    if ( !fp )
        exit ( -1 );
    char line [50];
    char *functions[MAX_SIZE];
    int index = 0;
    while (!feof(fp)) {
        fgets (line , 50 , fp);
        functions[index  ] = strdup (line);
    }
    fclose ( fp );
    for ( int i = 0; i < index; i  ) {
        printf ( "[%d] -> [%s]n", i, functions[i]);
    }
    for ( int i = 0; i < index; i  ) {
           free ( functions[i]);
}
}
  

Комментарии:

1. strdup является нестандартным (хотя и достаточно простым в реализации), а также требует free редактирования, когда данные больше не нужны (чего OP, похоже, хочет избежать).

2. что ж, это работает, мое спасибо. Возможно, потребуется некоторая помощь с освобождением, как сказал Крис, хотя, как мне это сделать?