Помогите реализовать ввод строк из файла в массив
Написал вот такой код:
#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 шт):
Смотрите свми - у вас есть одна строка 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");
}
Еще желательно проверять ошибки - а вдруг у вас файл не откроется, например?