将 scanf() 与“%c”一起使用时的前导空格
Leading whitespace when using scanf() with " %c"
我看了一圈,每个人都说在扫描单个字符时使用 " %c"
,因为输入流的开头可能有白色 space。
好吧,公平。但这是否仅适用于所述输入流中的第一个字符?如果我现在正在扫描许多连续字符的字符串中的单个字符怎么办? (例如:abcdef)
现在使用 " %c"
作为格式说明符不会搞砸吗?
当你说scanf("%d", &...)
读取一个整数时,它实际上跳过前导白色space,然后读取一个整数。
当你说scanf("%f", &...)
读取一个浮点数时,它实际上跳过前导白色space,然后读取一个浮点数。
当你说scanf("%s", ...)
读取一个字符串时,它实际上跳过前导白色space,然后读取一个字符串。
您开始看到规律了吗?好吧,不要抱太大希望,因为:
当您说 scanf("%c", &...)
来读取一个字符时,它 不会 跳过前导白色 space。如果有前导白色space,第一个白色space字符是%c
读取的字符。
%c
的这个奇怪异常对于最初设计 scanf
的人来说非常有意义,但从那以后它一直让其他人感到困惑。
这就是为什么,如果您实际要阅读的是非白色space字符,则必须使用格式说明符" %c"
,在[之前加上space =18=]。 space 匹配零个或多个 whitespace 字符,从而跳过任何前导 whitespace,并确保 %c
将尝试读取非 whitespace 字符给你。
而且由于这一切都非常混乱和违反直觉并且难以解释,有时您会看到 "Just use a leading space before %c
always" 的更简单的解释,因为任何人* 想要阅读的都是非白人space 字符,无论如何。
[* "anybody" 我的意思是,任何初学者都可以编写 C 程序。理论上可能有某个地方的专家想要使用 %c
来读取白色 space 字符。但是专家一般不会用 scanf
做任何事情。]
我看了一圈,每个人都说在扫描单个字符时使用 " %c"
,因为输入流的开头可能有白色 space。
好吧,公平。但这是否仅适用于所述输入流中的第一个字符?如果我现在正在扫描许多连续字符的字符串中的单个字符怎么办? (例如:abcdef)
现在使用 " %c"
作为格式说明符不会搞砸吗?
当你说scanf("%d", &...)
读取一个整数时,它实际上跳过前导白色space,然后读取一个整数。
当你说scanf("%f", &...)
读取一个浮点数时,它实际上跳过前导白色space,然后读取一个浮点数。
当你说scanf("%s", ...)
读取一个字符串时,它实际上跳过前导白色space,然后读取一个字符串。
您开始看到规律了吗?好吧,不要抱太大希望,因为:
当您说 scanf("%c", &...)
来读取一个字符时,它 不会 跳过前导白色 space。如果有前导白色space,第一个白色space字符是%c
读取的字符。
%c
的这个奇怪异常对于最初设计 scanf
的人来说非常有意义,但从那以后它一直让其他人感到困惑。
这就是为什么,如果您实际要阅读的是非白色space字符,则必须使用格式说明符" %c"
,在[之前加上space =18=]。 space 匹配零个或多个 whitespace 字符,从而跳过任何前导 whitespace,并确保 %c
将尝试读取非 whitespace 字符给你。
而且由于这一切都非常混乱和违反直觉并且难以解释,有时您会看到 "Just use a leading space before %c
always" 的更简单的解释,因为任何人* 想要阅读的都是非白人space 字符,无论如何。
[* "anybody" 我的意思是,任何初学者都可以编写 C 程序。理论上可能有某个地方的专家想要使用 %c
来读取白色 space 字符。但是专家一般不会用 scanf
做任何事情。]