Считайте произвольное количество символов со стандартного ввода до нажатия клавиши ввода C - PullRequest
0 голосов
/ 11 июля 2020

Я хочу создать программу, которая принимает произвольное количество символов из пользовательского ввода, пока не будет нажата клавиша «Enter», и сохранит их в буфере.

Есть ли способ чтения символы из stdin, не извлекая их , подсчитайте символы, затем выделите буфер точного размера, наконец, скопируйте символы в буфер.

В основном я НЕ хочу использовать getc в l oop и удвоение размера буфера по мере его истощения.

EDIT: Чтобы сделать мои намерения более ясными, позвольте мне express мою интуицию. Я представляю буфер stdin таким же, как файл (который может расти или не расти динамически). Таким образом, я должен иметь возможность перейти к его концу (представляющему конец пользовательского ввода), подсчитав смещение, а затем перемотать назад. Что-то вроде

long const start = ftell(stdin);
fseek(stdin, 0, SEEK_END);
long const length = ftell(stdin) - start;
rewind(stdin);

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Итак, читая комментарии и другие ответы, вам не нравится решение с использованием readline, потому что оно нестандартно. (ну, это не стандарт ISO или ANSI, но он все равно довольно популярен)

Вам не нравится соглашение об удвоении размера буфера (скорее всего, подход, используемый readline внутри компании), но вы не указывайте, почему вам это не нравится. Есть больше подходов, чем удвоение размера буфера, вы можете увеличить его, например, на фиксированную величину, но я думаю, что вы тоже не будете довольны этим решением.

Что мы можем тогда сделать, если вы получите 1 ГБ (Один HexaByte, 1.0E18 байт) данных до того, как вы получите первый символ новой строки? Как мы можем с этим справиться?

Как любой офис стандартизации может определить способ решения этой проблемы и указать способ правильной работы?

Вы действительно верите, что задаете правильный вопрос ?

0 голосов
/ 11 июля 2020

Команда readline() поддерживается в некоторых системах, и можно добавить к тем, которые его не поддерживают.

Со страницы man:

#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>

char *
readline (const char *prompt);

readline будет читать строку из терминал и верните его, используя prompt в качестве подсказки. Если prompt равно NULL или пустая строка, подсказка не выдается. Возвращенная строка выделяется с помощью mallo c (3); по завершении вызывающий должен освободить его. В возвращенной строке последний символ новой строки удален, поэтому остается только текст строки.

...