fgets指令被跳过。为什么?

时间:2010-05-25 17:44:25

标签: c scanf fgets

每当我在fgets之前执行scanf时,fgets指令就会被跳过。我已经在C ++中解决了这个问题,我记得我必须有一些可以清除stdin缓冲区或类似内容的指令。我想C有一个等价物。它是什么?

感谢。

2 个答案:

答案 0 :(得分:5)

我敢打赌这是因为\ n卡在输入流中。

请参阅其中一个问题:

I am not able to flush stdin.
How do I go about Flushing STDIN here?
scanf() causing infinite loop

this answer

另外:Why not to use scanf()

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]");