在scanf(或)printf中错误的格式说明符

printf函数而言,我从less数参考和实验中了解以下内容。

  • 当我们试图打印一个整数值与格式说明符用于浮动(或)双和反之亦然行为是不可预知的
  • 但可以使用%c来打印整数值的字符。 也可以使用%d来打印字符的ASCII值(整数表示)。

类似地,如果格式说明符和传递给scanf的参数不匹配scanf的行为是什么。 标准是否定义了它?

可变参数(与省略号匹配的参数)是默认提升的 。 这意味着所有较短的整型被提升为int (或者无符号)。 整数和字符之间没有区别( 我相信 )。 printf %d%c之间的区别仅仅是该值的格式

scanf是一个不同的水壶。 你传递的所有参数都是指针 。 指针之间没有默认的提升,而且传递与指针对象types相匹配的确切格式说明符至关重要。

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

首先,由于升级,与转换规范对应的types可能与传递给函数的types不一样。 例如,字符被提升为整数,因此printf(“%c”)真的期望一个int,然后将它转换为一个无符号的字符。 直接传递一个int与将int传递给一个unsigned char的效果相同,因此是安全的。

如果参数不具有预期的types,例如,如果传递一个float而不是一个整数,那么结果是未定义的。

scanf()是特别灾难性的,因为参数是指针。 如果你传递了一个指向char的指针,当函数需要一个指向float的指针时,函数将尝试在一个1字节的位置写入(比方说)4个字节,这是不好的。 你可能会得到一个段错误。