【问题标题】:How does C treat trailing spaces in scanf? [closed]C如何处理scanf中的尾随空格? [关闭]
【发布时间】:2019-02-23 18:28:44
【问题描述】:

如果scanf语句在格式字符串中有空格,如下所示,

scanf(" %c",&abc);

然后它会跳过无限数量的空格,直到碰到一个字符。
所以 \n p 作为输入会将 p 存储在 abc 中。

使用这个概念,我无法预测我输入的以下程序的输出。

char echo ;
do {
       scanf ("%c ", &echo);
       printf ("%c\n",echo);
} while (echo != '\n') ;

请注意,scanf 语句中有一个尾随空格

执行代码后,我得到以下行为。
它要求一个字符。 我输入 C
它要求一个字符。 我输入我
它打印 C。
它要求一个字符。 我输入 R
它打印出我。
它要求一个字符。 我输入 C
它打印 R。

这将永远持续下去。如果我按换行符,它就会跳过它。
为什么它在开头要求两个字符?它不应该执行 printf 语句吗?
为什么前一个输入的字符会打印在下一个?

【问题讨论】:

  • 我看不到您发布的代码如何与您对行为的描述相对应。我没有看到要求字符的代码。
  • “它要求一个字符”怎么样??scanf()之前尝试printf("\n==> "); fflush(stdout);
  • 尝试我的建议,而不是简单的闪烁光标作为输入提示。
  • 某种... scanf("%c ", &ch); 读取一个字符并跳过 0 个或多个空格。你输入“3ENTER”,你仍然被困在scanf() 中,忽略空格。您再输入几个 ENTER(制表符、空格),但您仍然被困在 scanf() 中。当您最终键入“7ENTER”时,scanf() 不再忽略空格(将“7ENTER”留在输入缓冲区中)并且程序继续。

标签: c character scanf


【解决方案1】:

scanf 格式中,空格字符匹配输入中任意数量的空白(空格、制表符和换行符)。

所以你输入C + newline 并没有任何反应,因为scanf 将字符C 匹配到%c 并且newline 被空间吃掉了。但是scanf 将继续,直到它得到不匹配的东西。因此,您可以在此处放置任意数量的空格、制表符和换行符。

scanf 读取到不匹配的内容时,它会调用ungetc(c, stdin) 将其放回标准输入并返回。所以空间会继续匹配,直到你放一些不同的东西。

这就是为什么当您键入 R + newline 时最后一个 scanf 会返回。然后下一个scanf 执行,它将R%c 匹配,换行与空格匹配。但是空格仍然匹配任何数量的空格。当您键入非空白字符时,它将结束。

【讨论】:

    猜你喜欢
    • 2014-02-20
    • 2011-10-29
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    相关资源
    最近更新 更多