Как создать динамический массив типа char, не запрашивая заранее его длину? - C (СИ)
Формулировка задачи:
Например, пользователь должен ввести арифметическое выражение. Он не знает, сколько это будет символов. Как в таком случае задать динамический массив?
Решение задачи: «Как создать динамический массив типа char, не запрашивая заранее его длину?»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 256
char *GetLongLongLine(FILE *f)
{ int k = 0;
char *buf = (char*) malloc(size);
char *res = (char*) malloc(size);
while(fgets (buf , size , f) != NULL)
{ if(k > 0)
{ k++;
res = (char*) realloc(res, k*size);
strcat(res, buf);
}
else
{ k++;
strcpy(res,buf);
}
if(strlen(buf) < size-1)
break;
}
res[strlen(res)-1] = '\0';
free(buf);
return res;
}
int main()
{ char *myLongLine = GetLongLongLine(stdin);
printf("\n%s", myLongLine);
free(myLongLine);
getchar();
return 0;
}
Объяснение кода листинга программы
- В функции
GetLongLongLineсоздается динамический массив типаcharс помощью функцииmalloc. Изначально выделяется память под строку максимальной длиной 256 символов. - В цикле
whileпроисходит чтение строк из файла с помощью функцииfgets. Если строка успешно прочитана, то она добавляется к результату. - Если строка не пустая и длина результата превышает размер выделенной памяти, то память увеличивается с помощью функции
reallocи результат дополняется до конца строки. - Если строка пустая, то результат дополняется нулевым символом.
- В конце функции результат освобождается от лишней памяти с помощью функции
freeи возвращается. - В функции
mainвызывается функцияGetLongLongLineс аргументомstdin, чтобы считать строку с клавиатуры. - Результат функции
GetLongLongLineвыводится на экран с помощью функцииprintf. - Память, выделенная под результат, освобождается с помощью функции
free. - Программа завершается с помощью функции
getcharиreturn 0.