C如何处理scanf中的尾随空格?

时间:2019-02-23 18:28:45

标签: c character scanf

如果 scanf 语句的格式字符串中有空格,如下所示,

list.stream()
            .map(item->new AbstractMap.SimpleEntry<>(item,servers))
            .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));

然后它会跳过无限数量的空格,直到碰到一个字符为止。
因此, \ n p 作为输入会将 p 存储在 abc 中。

使用此概念,我无法预测我键入的以下程序的输出。

scanf(" %c",&abc);

请注意,scanf语句中有一个跟踪空间

执行代码后,我得到以下行为。
它要求一个字符。 我输入C
它要求一个字符。 我输入我
打印C。
它要求一个字符。 我输入R
它打印I。
它要求一个字符。 我输入C
它显示R。

这将永远持续下去。如果按换行符,则会跳过它。
为什么在开始时要求两个字符?它不应该执行 printf 语句吗?
为什么上一个输入的字符会在下一个输入中打印出来?

1 个答案:

答案 0 :(得分:2)

scanf格式中,空格字符与输入中任意数量的空格(空格,制表符和换行符)匹配。

因此,您输入C + newline并没有任何反应,因为scanf将字符C%c匹配,并且newline被空格占用了。但是scanf将继续直到收到不匹配的内容。因此,您可以在此处放置任意数量的空格,制表符和换行符。

scanf读取不匹配的提示时,它将调用ungetc(c, stdin)将其放回标准输入并返回。因此,空间将继续匹配,直到您放置其他内容为止。

这就是为什么在键入scanf时返回最后一个R + newline的原因。然后执行下一个scanf,它将R%c匹配,并将换行符与空格匹配。但是空间仍然匹配任意数量的空格。当您键入非空格字符时,它将结束。