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

当格式字符串以换行符结尾时,scanf的行为是什么?,c,scanf,C,Scanf,对于以下代码:假设已定义x scanf("%d\n", &x); printf("foo"); 如果我按1并回车,我希望程序打印foo,但事实并非如此。 我必须按1,回车,2,回车才能看到它打印出来 现在的问题是,为什么我需要输入一些东西加上另一个回车键才能使scanf返回?scanf不可能只需要比格式字符串多输入一次,因为按1、ENTER、ENTER键也不起作用。事实上,无论我输入了多少输入,scanf都会一直等待,直到我输入其他内容 我在VisualStudio2010和MinGW

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

scanf("%d\n", &x);
printf("foo");
如果我按1并回车,我希望程序打印foo,但事实并非如此。 我必须按1,回车,2,回车才能看到它打印出来

现在的问题是,为什么我需要输入一些东西加上另一个回车键才能使scanf返回?scanf不可能只需要比格式字符串多输入一次,因为按1、ENTER、ENTER键也不起作用。事实上,无论我输入了多少输入,scanf都会一直等待,直到我输入其他内容

我在VisualStudio2010和MinGW中尝试了这个示例,它们产生了相同的结果。那么如何解释呢?这是Windows专用的吗?还是依赖于编译器?或者仅仅是这种使用scanf会产生未定义的行为?

scanf格式字符串中的“\n”以及空格、制表符“\r”、“\f”和“\v”使scanf忽略空白

ENTER是空白,因此scanf会尽可能多地忽略它,并且仅当它看到2中没有空白的内容时才会停止。

scanf格式字符串中的“\n”以及空格、制表符“\r”、“\f”和“\v”使scanf忽略空白


ENTER是空白,因此scanf尽可能忽略其中的大部分内容,只有在看到非空白的内容时才会停止。POSIX是这样说的:由一个或多个空白字符组成的指令应通过读取输入执行,直到无法读取更多有效输入,或直到第一个字节不是空白字符为止,还没读@谢谢你。因此,根据对\n的描述,格式字符串中的\n并不一定意味着用户必须使用\n作为输入。所有算作空白的内容都将与\n匹配,对吗?对。还有许多转换规范通过忽略前导空格来工作:例如%d与%d相同\n%d与\n\r\v\t\n\n\n%d相同,并且它与42或42POSIX相匹配。POSIX这样说:由一个或多个空格字符组成的指令应通过读取输入来执行,直到无法读取更多的有效输入为止,或者直到第一个字节不是空白字符,仍然未读@谢谢你。因此,根据对\n的描述,格式字符串中的\n并不一定意味着用户必须使用\n作为输入。所有算作空白的内容都将与\n匹配,对吗?对。还有许多转换规范通过忽略前导空格来工作:例如%d与%d相同\n%d与\n\r\v\t\n\n\n%d相同,并且它匹配42或42