当格式字符串以换行符结尾时,scanf的行为是什么?

对于以下代码:(假设已定义x)

scanf("%d\n", &x); printf("foo"); 

如果我按1和ENTER,我希望程序打印foo,但事实并非如此。 我必须按1,ENTER,2,ENTER才能看到它打印foo。

现在的问题是为什么我需要输入一些东西加上另一个ENTER来使scanf返回? 这可能不是scanf只需要比格式字符串多一个ENTER,因为按1,ENTER,ENTER也不会工作。 实际上,无论我输入多少个ENTER,scanf都会一直等待,直到我输入其他东西。

我在Visual Studio 2010和MinGW中尝试过这个例子,他们产生了相同的结果。 那怎么解释呢? 这是Windows特有的吗? 或编译器依赖? 或者只是这种scanf的使用会产生不确定的行为?

scanf格式字符串中的'\n' (以及空格,制表符, '\r''\f''\v' )使scanf忽略空格。

ENTER是空格,因此scanf尽可能多地忽略它,只有当它看到不是空白的东西时才会停止( 2 )。