每当我在fgets之前执行scanf时,fgets指令就会被跳过。我已经在C ++中解决了这个问题,我记得我必须有一些可以清除stdin缓冲区或类似内容的指令。我想C有一个等价物。它是什么?
感谢。
答案 0 :(得分:5)
我敢打赌这是因为\ n卡在输入流中。
请参阅其中一个问题:
I am not able to flush stdin.
How do I go about Flushing STDIN here?
scanf() causing infinite loop
P.S。 fgets()
是一个函数,而不是一个指令。
答案 1 :(得分:3)
调用fgets()
后的scanf()
函数可能 1 未被跳过。 可能 1 立即返回,在输入流中找到了换行符。
在scanf()
之前调用fgets()
几乎总会导致scanf()
在输入流中留下未使用的换行符('\n'
),这正是fgets()
寻找。
要混合scanf()
和fgets()
,您需要从输入流中调用scanf()
来删除留下的换行符。
用于刷新标准输入(包括换行符)的一种解决方案将是以下内容:
int c;
/* discard all characters up to and including newline */
while ((c = getchar()) != '\n' && c != EOF);
1 - 如果没有看到实际代码,很难确定。
或者,正如下面评论中提到的Jerry Coffin,您可以使用scanf("%*[^\n]");
。 "%*[^\n]"
指令指示scanf()
匹配非换行符并禁止转换结果的赋值。
/* match up to newline */
scanf("%*[^\n]");
/* discard the newline */
scanf("%*c");
来自http://c-faq.com/stdio/gets_flush1.html:
带
scanf()
的初始“%*[^\n]”
要么吃掉所有内容但不包括换行符,要么失败。后续“%*c”
(或普通旧getchar()
)将使用换行符(如果有的话)。最后“如果”也很重要:也许用户发出EOF信号。在这种情况下,
getchar()
或scanf("%*c")
可能 - 这个决定留给编写编译器的人 - 要么立即返回EOF,要么返回给用户以获得更多输入。如果实现者选择后者,用户可能需要额外一次点击“结束此事”(^ D,^ Z,鼠标按钮,前面板开关或其他)。如果不出意外,这很烦人。
或者,正如下面评论中提到的Chris Dodd,您可以使用scanf("%*[^\n]%*1[\n]");
。 "%*[^\n]%*1[\n]"
指令指示scanf()
匹配非换行符,然后匹配一个换行符并禁止转换结果的分配。
/* match and discard all characters up to and including newline */
scanf("%*[^\n]%*1[\n]");