[我读过,每个人都说在扫描单个字符时使用" %c"
,因为输入流的开头可能会有空白。
好,很公平。但这仅适用于所述输入流中的第一个字符吗?如果我现在正在扫描包含多个连续字符的字符串中的单个字符怎么办? (例如:abcdef)
现在是否不将" %c"
用作格式说明符?
[当您说scanf("%d", &...)
读取整数时,它实际上会跳过前导空格,然后读取一个整数。
[当您说scanf("%f", &...)
来读取浮点数时,它实际上会跳过前导空格,然后读取浮点数。
[当您说scanf("%s", ...)
读取字符串时,实际上会跳过前导空格,然后读取字符串。
您开始看到图案了吗?好吧,不要抱太大希望,因为:
当您说scanf("%c", &...)
来读取字符时,它会not跳过前导空格。如果有前导空格,则第一个空格字符是%c
读取的字符。
%c
的这个奇怪的例外对于最初设计scanf
的人来说是完全合理的,但是从那以后,它就使其他人感到困惑。
这就是为什么,如果您实际要读取的是非空格字符,则必须使用格式说明符" %c"
,并在%
之前加一个空格。该空格匹配零个或多个空格字符,从而跳过任何前导空格,并确保%c
将尝试为您读取一个非空格字符。
并且由于这是如此令人困惑,违反直觉且难以解释,因此有时您会看到更简单的解释:“始终在%c
之前使用引号”,因为所有*想要阅读的人都是-空格字符,无论如何。
[*“我的意思是任何人,任何初学者都写一个开始的C程序。从理论上讲,某个地方可能会有专家想要使用%c
来读取空白字符。但是专家通常不使用scanf
。]