c - 将 scanf() 与“%c”一起使用时的前导空格
问题描述
我已经阅读过,每个人都说" %c"
在扫描单个字符时使用,因为输入流的开头可能有空格。
好吧,公平。但这仅适用于所述输入流中的第一个字符吗?如果我现在正在扫描由许多连续字符组成的字符串中的单个字符怎么办?(例如:abcdef)
现在不会" %c"
用作格式说明符吗?
解决方案
当你说scanf("%d", &...)
读取一个整数时,它实际上会跳过前导空格,然后读取一个整数。
当你说scanf("%f", &...)
读取一个浮点数时,它实际上会跳过前导空格,然后读取一个浮点数。
当您说scanf("%s", ...)
要读取一个字符串时,它实际上会跳过前导空格,然后读取一个字符串。
你开始看到一种模式了吗?好吧,不要抱太大希望,因为:
当您说scanf("%c", &...)
要读取一个字符时,它不会跳过前导空格。如果有前导空格,则第一个空格字符是%c
读取的字符。
这个奇怪的例外对于%c
最初设计的人来说是完全合理的scanf
,但从那以后它一直让其他人感到困惑。
这就是为什么,如果你真正想读的是一个非空白字符,你必须使用格式说明符" %c"
,在 . 之前有一个空格%
。该空格匹配零个或多个空格字符,从而跳过任何前导空格,并确保%c
它将尝试为您读取非空格字符。
而且由于这一切都如此令人困惑和违反直觉且难以解释,有时您会看到更简单的解释“在%c
总是之前使用前导空格”,因为任何人*想要阅读的都是非空白字符,无论如何.
[* 我所说的“任何人”是指任何正在编写初级 C 程序的初学者。从理论上讲,某处可能有一位专家想用它%c
来读取空白字符。但专家一般不会scanf
用于任何事情。]
推荐阅读
- javascript - Shapefile 在 SHTML 中加载,但在 HTML 中失败
- firebase - 谷歌日历新活动推送通知
- notifications - oneM2M 数据通知处理程序没有被调用
- spring-boot - 如何配置 spring-boot 应用程序以使用自定义 HostnameVerifier?
- xamarin - android是否可以不进入OnDestroy()方法并保持应用程序运行
- c# - 如何删除 List 中的每个 N 项,直到 List.Count 超过目标值?
- python - aws lamda 与 boto3.client - 从 dict 读取输出和
- amp-html - 如何根据复选框的状态显示 div?
- python - Python:通过子进程捕获崩溃程序的标准输出
- angular - 使用 Spring Boot 构建 Angular 应用程序