我已经读过了,每个人都说在扫描单个字符时使用" %c",因为输入流的开头可能有空格。
好吧,公平。但这只对输入流中的第一个字符有效吗?如果我现在扫描的是一个由许多相邻字符组成的字符串中的单个字符怎么办?(例如:abcdef)
使用" %c"作为格式说明符会不会把它搞砸?

最佳答案

当您说要读取整数时,它实际上跳过前导空白,然后读取整数。
当您说要读取浮点数时,它实际上会跳过前导空白,然后读取浮点数。
当您说要读取字符串时,它实际上跳过前导空白,然后读取字符串。
你开始看到规律了吗?别抱太大希望,因为:
当您说要读取字符时,它不会跳过前导空白。如果有前导空白,则第一个空白字符是scanf("%d", &...)读取的字符。
这个奇怪的异常对于第一个设计scanf("%f", &...)的人来说是非常有意义的,但是从那以后,它就一直把其他人搞糊涂了。
这就是为什么,如果您真正想读取的是非空白字符,则必须使用格式说明符scanf("%s", ...),并在scanf("%c", &...)之前加一个空格。该空格与零个或多个空白字符匹配,因此跳过任何前导空白,并确保%c将尝试为您读取非空白字符。
而且,由于这一切都是如此混乱,违反直觉,难以解释,有时你会看到更简单的解释“总是在%c之前使用前导空格”,因为任何人*想读的都是非空白字符。
[*我说的“任何人”是指,任何一个写C程序的初学者。理论上,某个地方可能有专家想用scanf来读取空白字符。但专家通常不会使用" %c"来做任何事情。]

关于c - 将scanf()与“%c”一起使用时,前导空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58294019/

10-09 09:43