c - 关于scanf函数中格式化字符串的问题

标签 c scanf

For each of the following pairs of scanf format strings, indicate whether or not the two strings are equivalent. If they're not, show how they can be distinguished:

(b) "%d-%d-%d" versus "%d -%d -%d"


所以在这种情况下,我的回答是它们不等价。因为除了以 % 开头的转换说明符以外的非空白字符, 前面不能有空格,它将与非空白字符不匹配。所以在第一种情况下,第一个和第二个整数后面不允许有空格,而在第二种情况下,前两个整数后面允许有任意数量的空格。
但我看到这本书有不同的答案。它说它们彼此等效。
这是书的错吗?或者我只是对 scanf 中格式字符串的概念有误解功能?

最佳答案

书错了。根据 scanf() 的规范:

  • 空白字符 :该函数将读取并忽略在下一个非空白字符之前遇到的任何空白字符(空白字符包括空格、换行符和制表符——请参阅 isspace)。格式字符串中的单个空格验证从流中提取的任意数量的空格字符(包括无)。
  • 非空白字符 , 除了格式说明符 (%):任何不是空白字符(空格、换行符或制表符)或格式说明符(以 % 字符开头)的一部分的字符都会导致函数从流中读取下一个字符,将其与此非空白字符进行比较,如果匹配,则将其丢弃,函数继续使用格式的下一个字符。如果字符不匹配,则函数失败,返回并保留未读流的后续字符。

  • 所以在第一种情况下 scanf到达 %d并获取输入,接下来是 -这意味着 scanf预计流中的下一个会看到 non-whitespae人物 -而不是任何其他 whitespace特点。所以合法的输入是1- 2 ,但不是 1 -2在第二种情况下,在第一个 %d 之后, scanf将允许 whitespace然后将到达 non-whitespace ,所以它将允许输入 1 - 2根据以上定义。

    关于c - 关于scanf函数中格式化字符串的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66517019/

    相关文章:

    C 程序跳过字符串中的第一个字符

    c - K&R C 反转功能

    c - C 中带有 char* 数组的 scanf 段错误

    C - for 循环仅执行 scanf 之后的循环

    编译器不处理 freertos #define 代码

    c - '%' 和格式说明符之间的数字在 scanf 中意味着什么?

    c - 如何使用 fscanf() 读取包含整数的文件?

    c - 获取变量的地址

    c - 如何使用Arduino在LCD上闪烁单个字符而没有延迟()方法?

    c - 如何屏蔽视频中的某个窗口或区域