fgets指令被跳过了,为什么?

每当我在fgets之前执行scanf,fgets指令就会被跳过。 我用C ++来讨论这个问题,我记得我不得不进行一些修改,以清除stdin缓冲区或类似的东西。 我想这和C有一个相同的意义。

谢谢。

我敢打赌,这是因为\ n卡在inputstream中。

看到其中一个问题:

我无法刷新标准input。
我在这里怎么去Flushing STDIN?
scanf()导致无限循环

或这个答案 。

另外: 为什么不使用scanf() 。

PS fgets()是一个函数,而不是一个指令。

调用scanf()之后的fgets()函数可能不会被跳过。 它可能是 1立即返回在inputstream中find一个换行符。

fgets() scanf()之前调用scanf()几乎总是导致scanf() )在inputstream中留下未使用的换行符( '\n' ),这正是fgets()正在寻找的内容。

为了混合scanf()fgets() ,你需要从inputstream中移除scanf()调用留下的换行符。

一个用于清除stdin(包括换行符)的解决scheme应该是以下内容:

 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

一个带有“%*[^\n]”的初始scanf()会把所有的东西吃掉,但不包括换行符,或者失败。 后续的“%*c” (或普通的旧的getchar() )将消耗换行符,如果有的话。

最后一个“如果”也很重要:也许用户发信号给EOF。 在这种情况下, getchar()或者scanf("%*c")可能 – 这个决定留给编写编译器的人 – 要么立即返回EOF,要么返回给用户input更多的信息。 如果执行者select后者,则用户可能需要额外一次点击“结束这件事”(^ D,^ Z,鼠标button,前面板开关或其他)。 这是烦人的,如果没有别的。


或者,正如克里斯·多德在下面的评论中所build议的,你可以使用scanf("%*[^\n]%*1[\n]");"%*[^\n]%*1[\n]"指令指示scanf()匹配非新行的内容,然后匹配一个换行符,并禁止转换结果的赋值。

 /* match and discard all characters up to and including newline */ scanf("%*[^\n]%*1[\n]");