Как и предполагалось, вы можете использовать getchar () для чтения из консоли до тех пор, пока не будет возвращен конец строки или EOF, создавая свой собственный буфер. Динамическое увеличение буфера может произойти, если вы не можете установить разумный максимальный размер строки.
Вы также можете использовать fgets в качестве безопасного способа получения строки в виде строки с нулевым символом в конце:
#include <stdio.h>
char line[1024]; /* Generously large value for most situations */
char *eof;
line[0] = '\0'; /* Ensure empty line if no input delivered */
line[sizeof(line)-1] = ~'\0'; /* Ensure no false-null at end of buffer */
eof = fgets(line, sizeof(line), stdin);
Если вы исчерпали ввод с консоли или по какой-то причине операция завершилась неудачно, возвращается eof == NULL и линейный буфер может быть неизменным (вот почему установка первого символа '\ 0' удобна).
fgets не заполняет строку [] и гарантирует, что после последнего принятого символа в успешном возвращении будет ноль.
Если достигнут конец строки, символ, предшествующий завершающему '\ 0', будет '\ n'.
Если нет завершающего '\ n' перед окончанием '\ 0', возможно, имеется больше данных или что следующий запрос сообщит об окончании файла. Вы должны будете сделать еще один fgets, чтобы определить, что есть что. (В этом отношении цикл с getchar () проще.)
В приведенном выше (обновленном) примере кода, если строка [sizeof (строка) -1] == '\ 0' после успешного выполнения fgets, вы знаете, что буфер был заполнен полностью. Если за этой позицией стоит '\ n', вы знаете, что вам повезло. В противном случае в stdin будет больше данных или конец файла. (Когда буфер заполнен не полностью, вы все равно можете находиться в конце файла, и в конце текущей строки также не может быть '\ n'. Так как вам нужно сканировать строку, чтобы найти и / или исключить любой \ n перед концом строки (первый \ 0 в буфере), я склонен предпочесть использовать getchar () в первую очередь.)
Сделайте то, что вам нужно сделать, чтобы по-прежнему было больше строки, чем сумма, которую вы прочитали в качестве первого чанка. Можно привести примеры динамически растущего буфера для работы с getchar или fgets. Есть некоторые хитрые крайние случаи, на которые следует обратить внимание (например, помня, чтобы следующий ввод начинался с сохранения в позиции '\ 0', которая закончила предыдущий ввод перед расширением буфера).