繁体   English   中英

从标准输入读取任意数量的字符,直到在 C 中按下回车键

[英]Read arbitrary number of characters from stdin until pressing enter in C

我想制作一个程序,它接受来自用户输入的任意数量的字符,直到按下“enter”,并将它们存储在缓冲区中。

有没有办法从stdin读取字符而不提取它们,计算字符,然后分配一个精确大小的缓冲区,最后将字符复制到缓冲区。

基本上,我不希望在循环中使用getc并将缓冲区大小加倍,因为它已经用完。

编辑:为了让我的意图更清楚,让我表达我的直觉。 我想象标准输入缓冲区与文件相同(可能会或可能不会动态增长)。 所以我应该能够找到它的结尾(代表用户输入的结尾),计算偏移量然后倒回。 就像是

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

readline()命令在某些系统上受支持,并且可以添加到那些不支持它的系统上。

man页:

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

char *
readline (const char *prompt);

readline将从终端读取一行并将其返回,使用prompt作为提示符。 如果promptNULL或空字符串,则不提示。 返回的行用 malloc(3) 分配; 调用者必须在完成后释放它。 返回的行删除了最后的换行符,因此只保留了该行的文本。

因此,通过阅读评论和其他回复,您不喜欢使用readline的解决方案,因为它不是标准的。 (嗯,它不是 ISO 或 ANSI 标准,但无论如何它很受欢迎)

您不喜欢将缓冲区大小加倍的约定(很可能是readline内部使用的方法),但您没有说明为什么不喜欢它。 除了将缓冲区大小加倍之外,还有更多的方法,例如,您可以将其增加一个固定数量,但我认为您也不会对该解决方案感到满意。

那么,如果您在收到第一个换行符之前收到 1Hb(一个 HexaByte,1.0E18 字节)的数据,我们该怎么办? 我们该如何处理呢?

任何标准化办公室如何定义处理此问题的方法,并指定正确进行的方法?

你真的相信你在问正确的问题吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM