【发布时间】:2015-11-02 19:15:08
【问题描述】:
是否有一个库函数可以从标准输入读取一行输入并满足以下要求?
- 我有一个特定大小的有限静态缓冲区(大小可能是一个已知常数)。
- 不允许动态分配。所以不能使用getline()之类的库函数。
- 对于长度超过缓冲区大小的行,该行的未读尾部将被忽略。
我读取一行的解决方案是使用fgets 和一个循环来读取并忽略尾部。代码如下
char buffer[80], tail_buffer[80];
char * line, * tail;
line = tail = fgets(buffer, 80, stdin);
/* Read the tail part to ignore it */
while (tail != NULL && tail[strlen(tail)-1] != '\n')
{
tail = fgets(tail_buffer, 80, stdin);
}
/* Use 'line' as needed */
【问题讨论】:
-
我不会说您的解决方案真的很优雅,原因之一是您使用的是
while(!feof(stdin)),即wrong -
@Linus !feof(stdin) 有什么问题?我使用它是因为结束字符可能不是 EOF 上的 '\n'。但这可能是不必要的,因为 fgets 的下一次调用无论如何都会返回 NULL。
-
@jayant 这里不需要代码审查。我只需要了解是否有类似于 getline() 的库函数通过截断尾部将完整的行读取到有限的缓冲区中。
-
“我正在努力寻找更好的解决方案”。那是为了代码审查。