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