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