首页 > 解决方案 > 将 scanf() 与“%c”一起使用时的前导空格

问题描述

我已经阅读过,每个人都说" %c"在扫描单个字符时使用,因为输入流的开头可能有空格。

好吧,公平。但这仅适用于所述输入流中的第一个字符吗?如果我现在正在扫描由许多连续字符组成的字符串中的单个字符怎么办?(例如:abcdef)

现在不会" %c"用作格式说明符吗?

标签: cformatscanfwhitespaceformat-specifiers

解决方案


当你说scanf("%d", &...)读取一个整数时,它实际上会跳过前导空格,然后读取一个整数。

当你说scanf("%f", &...)读取一个浮点数时,它实际上会跳过前导空格,然后读取一个浮点数。

当您说scanf("%s", ...)要读取一个字符串时,它实际上会跳过前导空格,然后读取一个字符串。

你开始看到一种模式了吗?好吧,不要抱太大希望,因为:

当您说scanf("%c", &...)要读取一个字符时,它不会跳过前导空格。如果有前导空格,则第一个空格字符是%c读取的字符。

这个奇怪的例外对于%c最初设计的人来说是完全合理的scanf,但从那以后它一直让其他人感到困惑。

这就是为什么,如果你真正想读的是一个非空白字符,你必须使用格式说明符" %c",在 . 之前有一个空格%。该空格匹配零个或多个空格字符,从而跳过任何前导空格,并确保%c它将尝试为您读取非空格字符。

而且由于这一切都如此令人困惑和违反直觉且难以解释,有时您会看到更简单的解释“在%c总是之前使用前导空格”,因为任何人*想要阅读的都是非空白字符,无论如何.

[* 我所说的“任何人”是指任何正在编写初级 C 程序的初学者。从理论上讲,某处可能有一位专家想用它%c来读取空白字符。但专家一般不会scanf用于任何事情。]


推荐阅读