Как в СИ можно ввести строки не зная их длины и количества строк

Как на языке СИ ввести двумерный строчный массив текста произвольной длины и количества строк. Или как можно ввести строки не зная их длины и количества строк.

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

([abc]{def}) 
)[abc]{def}(  
{}[]()

или

}}}}  
{}{}{}{}{}{}aaa

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

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

Если кол-во строк не известно, то должен быть признак конца. Например, конец файла, пустая строка, специальная строка ( к примеру "---END---").

Теперь, с чтением строк неизвестного размера. В общем случае они не могут быть бесконечно большими. Поэтому, можно читать завести буфер достаточного размера и читать.

Можно воспользоваться getline. Тогда чтение будет где то такое

char* data = NULL;
int real = getline(&data, 0, stdin);
// делаем что то с данными, real - размер строки, data - сами данные stdin - стандартный ввод
free(data);

да, согласно документации, getline сам выделит память, если передать ему ссылку на указатель на NULL и 0 как размер.

Завернем теперь это все

FILE *f =fopen(...);
int real;
char* buf = NULL;
while ((real = getline(buf, 0, f) > 0) {
  // делаем что то с данными в buf.
  free(buf);
  buf = NULL;
}
fclose(f);
→ Ссылка