Помогите реализовать ввод строк из файла в массив

Написал вот такой код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>

int main(){
    FILE *fin, *fout;
    fin = fopen("sum.in", "r");
    //fout = fopen("sum.out", "w");
    int n;
    fscanf(fin, "%d\n", &n);
    printf("%d\n", n);
    char *input[n];
    char temp_str[256];
    *input = (char*)malloc(sizeof(char) * n);
    printf("flag\n");
    for (int i = 0; i < n; i++){
        fscanf(fin, "%s", temp_str);
        printf("str %s\n", temp_str);
        input[i] = temp_str;
    }
    printf("%d\n", n);
    for (int i = 0; i < n; i++){
        printf("%s\n", input[i]);
    }
    free(input);
    system("pause");
}

Все строки массива оказались равны последней, как исправить код?


Ответы (1 шт):

Автор решения: Mikhailo

Смотрите свми - у вас есть одна строка temp_str, в которую вы поочередно пишете все строки (вернее, слова - %s читает не строку, а слово) файла, и все ваши элементы массива указывают потом на нее

input[i] = temp_str;

Так что все они указывают на то, что было записано последним.

Зачем у вас

*input = (char*)malloc(sizeof(char) * n);

я не понимаю, это просто выделение памяти под n символов, первому элементу присвоенное.

Вы могли бы выделять, например, достаточное количество памяти сразу -

char input[n][256];

и читать прямо в строку

fscanf(fin, "%s", input[i]);

или использовать ту же strdup для выделения памяти для строк:

input[i] = temp_str;

или написать самому

input[i] = (char*)malloc(sizeof(char)*(strlen(temp_str)+1);
strcpy(input[i],temp_str);

только тогда надо не забыть освободить всю память (кстати, и файл надо закрыть). И не

free(input);

которое не работает - input выделено в стеке, а циклом.

Последнее - в С

char *input[n];

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

Так что мне больше нравится такой код:

int main() {
    FILE* fin, *fout;
    fin = fopen("sum.in", "r");
    //fout = fopen("sum.out", "w");
    int n;
    fscanf(fin, "%d\n", &n);
    printf("%d\n", n);
    char** input = (char**)malloc(sizeof(char*)*n);
    printf("flag\n");

    for (int i = 0; i < n; i++) {
        char temp_str[256];
        fscanf(fin, "%s", temp_str);
        printf("str %s\n", temp_str);
        input[i] = strdup(temp_str);
        }

    fclose(fin);

    printf("%d\n", n);

    for (int i = 0; i < n; i++)
        printf("%s\n", input[i]);

    for (int i = 0; i < n; i++)
        free(input[i]);

    free(input);
    system("pause");
    }

Еще желательно проверять ошибки - а вдруг у вас файл не откроется, например?

→ Ссылка