【问题标题】:Wrong format specifiers in scanf (or) printfscanf(或)printf 中的格式说明符错误
【发布时间】:2012-10-01 13:21:13
【问题描述】:

printf这个函数而言,我从一些参考资料和实验中了解到以下内容。

  • 当我们尝试使用 用于浮点(或)双精度的格式说明符打印整数值时,反之亦然,行为是不可预测的
  • 但可以使用%c 打印整数值的等效字符。也可以使用%d 打印字符的 ASCII 值(整数表示)。

同样,scanf 的行为是什么,如果 格式说明符和传递给 scanf 的参数不匹配。标准有定义吗?

【问题讨论】:

    标签: c input printf scanf


    【解决方案1】:

    可变参数(与省略号 ... 匹配的参数)是默认提升的。这意味着所有较短的整数类型都被提升为int(或无符号,视情况而定)。整数和字符之间没有区别 (I believe)。 printf 中的%d%c 之间的区别仅仅是值的格式

    scanf 是一壶不同的鱼。您传递的所有参数都是指针。指针之间没有默认提升,传递与指针类型匹配的确切格式说明符至关重要。

    在任何一种情况下,如果您的格式说明符与提供的参数不匹配(例如,将int * 传递给printf 中的%p),结果是未定义的行为,即比“不可预测”要糟糕得多——这意味着您的程序只是格式错误。

    【讨论】:

    • 我不确定“格式错误”是描述它的最佳方式。如果行为未定义,则您的程序基本上是不正确的,但实现不需要警告您。
    • “在 printf() 中将 int* 传递给 %p”可能不是最有教益的例子,因为很多 C 程序员都认为它是正确的。最好先使用一个更明显错误的示例(例如 int*%f),然后可能包含将 int* 传递到 %p 的信息在技术上也是不正确的。
    • @PascalCuoq:嗯,我认为这恰恰是说教因为许多人认为——错误地——这是正确的。
    • @KerrekSB 这是你的答案。这只是一个建议。换句话说,我认为您的回答非常适合已经知道void*int* 不兼容并且让其他人感到困惑的开发人员。
    • @KerrekSB,你能提供一个标准参考吗?我对将int 传递给%c 特别感兴趣。那是UB吗?
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多