假设代码不块和下一行运行立即(如你似乎在这个问题早在a comment表示),你搅拌时有一个共同的问题,非线为基础,线基于输入。
会发生什么事是你必须留在缓冲区换行,并与fgets看到的是,读取它,并返回,而不是做你真正想要的:忽略它,然后读线。
的解决方案是简单地做自己的忽略的部分,然后调用与fgets:
#include <stdio.h>
#include <string.h>
FILE* ignoreline(FILE* stream) {
for (int c; (c = fgetc(stream)) != EOF;) {
if (c == '\n') break;
}
return stream;
}
void example_use() {
char buf[1000];
ignoreline(stdin);
fgets(buf, sizeof buf, stdin);
// or, since it returns the stream, can be more compact:
fgets(buf, sizeof buf, ignoreline(stdin));
}
int main() { // error handling omitted
int n;
printf("Enter a number: ");
scanf("%d", &n);
char buf[1000];
printf("Enter a line: ");
ignoreline(stdin); // comment this line and compare the difference
fgets(buf, sizeof buf, stdin);
*strchr(buf, '\n') = '\0';
printf("You entered '%s'.\n", buf);
return 0;
}
注意,这也是常见的,并鼓励他们“配对”的ignoreline与scanf函数(或其他非线基于输入)将其转化为基于行的输入。在这种情况下,您可能需要对其进行修改,以便您可以分辨输入“42 abc”和“42”(在“输入数字”情况下)之间的区别。有些人只是在任何地方都使用fgets,然后用sscanf解析该行,并且这可以工作,但没有必要。
这个问题是非常明确的,我认为它可以保持原样。 – extraneon 2010-02-22 15:27:01
我确实同意它更清楚。 – 2010-02-22 15:28:26
你*可能*编辑这个更清晰的“我如何正确地调用fgets与stdin来做X”,**包含一个测试用例**(或至少是示例代码)等。 – 2010-02-22 15:33:03