在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个字节,这是不好的。 你可能会得到一个段错误。