Флаги указаны, чтобы не отображать вводимые символы, а так без этих флагов будет все нормально. Тогда, когда ты нажимаешь кнопку, она сразу же возвращается например в getch, так ты можешь считать сколько ввел пользователь символов, также, если нажат backspace, то уменшить на один счетчик. Когда нажимаешь enter, то производить то, что ввел пользователь. Флаги которые я привел в примере, отключают канонический режим, я уже не помню что это значит. Но вот я писал программу, и использовал там это. https://github.com/xverizex/rfcreader
А что тебе мешает, скажем, выделить буфер в 1024 символа, да заполнять его? Если вдруг больше будет введено, сделай realloc. Ну и считай после ввода. Всегда так и делали, чего велосипед изобретать?
Если пользователь введет 2048 символов то придется 1. выделять новый буфер, 2. копировать в него старые символы, 1026. удалять старый буфер. Но если заранее известен размер то всего этого ненужно делать. Пока всё это происходит, где нибудь на какой нибудь линии может произойти таймаут.
Нет, я просто извлеку столько сколько узнаю, а остальное следующий раз.
Чем это отличается от ситуации с фиксированным размером буфера? Перевыделять память всё равно придётся. Premature optimization не сделает код красивее.
Если пользователь введет 2048 символов то придется 1. выделять новый буфер, 2. копировать в него старые символы, 1026. удалять старый буфер. Но если заранее известен размер то всего этого ненужно делать. Пока всё это происходит, где нибудь на какой нибудь линии может произойти таймаут.
Какие страшные сказки, не имеющие к реальности никакого отношения.
Видимо все таки не знаешь, ибо реаллок ОЧЕНЬ РЕДКО выделяет новый буфер и копирует туда данные. Даже на хабре это разбирали. Ну и, само собой, увеличивать буффер после каждого выхода за размер нужно не на один элемент, а на несколько.
Ты еще скажи, что когда на диске к файлу что-то дописываешь, то модуль ФС создает новый файл бóльшего размера, копирует туда первоначальный + твое, а потом старый удаляет.
Задача аналогична чтению из файла неизвестной длины?
Ну если нет минималистичных решений то скорее всего да. Но getline() возвращает же единый буфер, а вдруг он знает размер введенной строки, и если да, то почему и я не могу?
Но getline() возвращает же единый буфер, а вдруг он знает размер введенной строки, и если да, то почему и я не могу?
Потому что вы основ не понимаете. Что значит размер введенной строки? Сколько есть в ядерном буфере? Сколько есть в буфере read(2)? Сколько есть в буфере fgets(3)? Сколько возвратит getline? Это совсем разные размеры. Даже первый размер может быть разным, например по сети приходит, часть уже готовится для передачи в пользовательский процесс, так как его надо разбудить, а часть ещё вообще пока в текущем пакете TCP и лежит в буфере стека сети.
Не обижаюсь.
Тем не менее, я потому и дал ссылку на статью, что изменение адреса массива != выделение нового и копирование, из-за игр с виртуальной памятью. Если, конечно, виртуальная память в системе поддерживается.
Это тот размер который занимает строка в конце ввода которой пользователь нажал return и она отправилась в какой нибудь там буфер ввода вывода. У нее есть четкие границы - начало и символ новой строки.