【问题标题】:What's the behavior of scanf when the format string ends with a newline?当格式字符串以换行符结尾时,scanf 的行为是什么?
【发布时间】:2021-07-23 21:02:12
【问题描述】:

对于以下代码:(假设已定义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 的用法会产生未定义的行为?

【问题讨论】:

    标签: c scanf


    【解决方案1】:

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

    ENTER 是空格,因此 scanf 会尽可能多地忽略它,并且仅在看到非空格(2)时才停止。

    【讨论】:

    • POSIX 是这样说的:“由一个或多个空白字符组成的指令应通过读取输入来执行,直到无法读取更多有效输入,或者直到第一个字节不是一个空白字符,仍然未读。” (pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html)
    • @pmg 谢谢。所以根据 \n 的描述,格式字符串中的 \n 并不一定意味着用户必须使用 \n 作为输入。算作空白的所有内容都将与 \n 匹配,对吗?
    • 没错。还有许多转换规范通过忽略前导空格来工作:例如,"%d"" %d" 相同,与 "\n%d" 相同,与 "\n\r\v\t \n\n\n%d" 相同,它匹配 42<WHITESPACE>42
    猜你喜欢
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多