c - 关于scanf函数中格式字符串的问题
问题描述
对于以下每对
scanf
格式字符串,指出这两个字符串是否等价。如果不是,请说明如何区分它们:(b)
"%d-%d-%d"
对"%d -%d -%d"
所以在这种情况下,我的回答是它们不相等。因为除了以 开头的转换说明符之外的非空白字符%
不能以空格开头,因此它不会与非空白字符匹配。所以在第一种情况下,第一个和第二个整数后面不允许有空格,而在第二种情况下,前两个整数后面可以有任意数量的空格。
但我看到这本书有不同的答案。它说它们是彼此等价的。这是书的错误吗?还是我对scanf
函数中格式字符串的概念有误?
解决方案
书错了。根据规范scanf()
:
- 空白字符:该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——参见 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。
- 非空白字符,格式说明符 (%) 除外:任何不是空白字符(空白符、换行符或制表符)或格式说明符的一部分(以 % 字符开头)的字符都会导致函数读取下一个字符从流中,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数失败,返回流的后续字符并将其保留为未读。
因此,在第一种情况下,当scanf
到达%d
并获取输入时,next 是-
指scanf
将期望流中的下一个看到non-whitespae
字符-
而不是任何其他whitespace
字符。所以合法的输入是1- 2
,但不是1 -2
在第二种情况下,在 first 之后%d
,scanf
将允许whitespace
and than 将到达non-whitespace
,因此它将允许1 - 2
上述定义的输入。
推荐阅读
- python - 如何使用 Canny 边缘检测去除背景
- reactjs - React-Query - 使用 react-testing-library 进行单元测试
- python - 从opencv中的数独中提取框
- python - 如何保存和运行我在 Pycharm 中更改的脚本?
- .net - 如何将默认的“dotnet”命令更改为 .NET 5?
- iphone - Xcode M1:专为 iPhone 运行
- f# - F# 请说明结果是如何计算出来的(List.fold (+) (-))
- python - 使用谷歌云日志客户端后,条目从谷歌日志中消失
- spring-boot - 未登录的简单 Spring Security 示例
- sql - 查找这些记录的 SELECT 语句是什么?