将 scanf() 与“%c”一起使用时的前导空格

Asi*_*ino 0 c format whitespace scanf format-specifiers

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

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

" %c"现在用作格式说明符不会把事情弄乱吗?

Ste*_*mit 7

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

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

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

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

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

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

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

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

[* 我所说的“任何人”是指任何编写 C 程序的初学者。理论上,某个地方可能有一位专家想要用来%c读取空白字符。但专家通常不会用于scanf任何用途。]