我无法刷新标准输入。如何在 C 中刷新标准输入?
如何刷新标准输入?
为什么它在下面的代码片段中不起作用?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main() {
int i = 0, j = 0, sat;
char arg[256];
char *argq;
argq = malloc(sizeof(char) * 10);
printf("Input the line\n");
i = read(0, arg, sizeof(char) * 9);
arg[i - 1] = '\0';
fflush(stdin);
i = read(0, argq, sizeof(char) * 5);
argq[i - 1] = '\0';
puts(arg);
puts(argq);
return 0;
}
现在,如果我输入 11 个字符,则只应读取 9 个字符,但 stdin 中的其余两个字符不会刷新并在 argq 中再次读取。为什么?
输入:123 456 789
输出:
123 456
89
为什么我会得到这个 89
作为输出?
How to flush the stdin??
Why is it not working in the following code snippet?
#include <string.h>
#include <stdio.h>
#include <malloc.h>
#include <fcntl.h>
int main() {
int i = 0, j = 0, sat;
char arg[256];
char *argq;
argq = malloc(sizeof(char) * 10);
printf("Input the line\n");
i = read(0, arg, sizeof(char) * 9);
arg[i - 1] = '\0';
fflush(stdin);
i = read(0, argq, sizeof(char) * 5);
argq[i - 1] = '\0';
puts(arg);
puts(argq);
return 0;
}
Now if I give the input as 11 characters, only 9 should be read but the remaining two characters in the stdin are not flushed and read again in the argq. Why?
Input: 123 456 789
Output:
123 456
89
Why am I getting this 89
as the output?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
我相信 fflush 仅用于输出流。
您可以尝试 fpurge 或 __fpurge。请注意,fpurge 是非标准且不可移植的。您可能无法使用它。
来自 Linux fpurge 手册页:通常想要丢弃输入缓冲区是一个错误。
用于刷新标准输入的最便携的解决方案可能是以下内容:
I believe fflush is only used with output streams.
You might try fpurge or __fpurge on Linux. Note that fpurge is nonstandard and not portable. It may not be available to you.
From a Linux fpurge man page: Usually it is a mistake to want to discard input buffers.
The most portable solution for flushing stdin would probably be something along the lines of the following:
从 comp.lang.c 常见问题解答中,请参阅:
From the comp.lang.c FAQ, see:
这就是我清除输入缓冲区的方法。
Is how I'd clear the input buffer.
刷新输入流正在调用未定义的行为。不要尝试。
您只能刷新输出流。
Flushing input streams is invoking Undefined Behavior. Don't try it.
You can only flush output streams.
您将使用
'\0'
覆盖arg
中输入的最后一个元素。该行应该是arg[i]='\0';
(在错误和边界检查之后,您丢失了。)其他人已经评论了刷新部分。
You are overriding the last element of the input in
arg
with'\0'
. That line should bearg[i]='\0';
instead (after error and boundary checking you are missing.)Other's already commented of the flushing part.
如果你使用 GLIBC,你可以手动搞乱 stdin ptr
If you use GLIBC you can just mess with the stdin ptr manually
在 Linux 中,如果不遇到命令在某些情况下开始等待输入的情况,就无法清理 stdin。解决这个问题的方法是将所有 std::cin 替换为 readLineToStdString():
这也将允许您在 std::cin 字符串中输入空格。
You can't clean stdin in Linux without bumping into scenarios that the command will start waiting for input in some cases. The way to solve it is to replace all std::cin with readLineToStdString():
This will also allow you to enter spaces in std::cin string.
在 Windows 中,您可以使用倒带(stdin)功能。
In Windows you can use rewind(stdin) fuction.