用printf输出浮点型数据时出现错误

用printf输出浮点型数据时出现错误,第1张

明白两点,问题就迎刃而解:

int型和char型是兼容的,即int型可以用%c输出,输出是字符;反过来char型可以用%d输出,输出是十进制整数。

浮点数没有被定义为无符号型,所以用unsigned修饰float型后实质是将变量声明成了int型。

根据以上两点,解释如下:

图1在正确输出i(A)并回车后,把j的4个字节拿出一个最低字节按字符输出,由于65的浮点尾数低字节是0,是%c的不可显示字节,所以只输出了个回车。接着按char型取出j的第二个字节(还是0)输出,结果同上。

图2的j和k交换位置后,前两个兼容都输出字符A,到最后一个j时才遇到上面刚才分析过的情况。

图3由于j成了无符号整数,所以输出都正确。

供参考。建议不弄这种题,由于输出格式化控制字符串与变量类型不匹配,本身就是错误的,不同的编译器很可能做出不同的处理,所以结果也可能会不同……

可以

vsprintf()函数中的自变量是位于数组中的,数组元素的字符串之前都要加上百分号(%)。这个函数是“一步一步[step-by-step]”按顺序执行。在第一个%后,将插入第一个数组元素;在第二个%后,将插入第二个数组元素,依次类推。

vsprintf是sprintf的一个变形,它只有三个参数。vsprintf用于执行有多个参数的自订函式,类似printf格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字元缓冲区和一个格式字串。第三个参数是指向格式化参数阵列的指标。实际上,该指标指向在堆叠中供函式呼叫的变数。va_list、va_start和va_end巨集(在STDARG.H中定义)帮助我们处理堆叠指标。本章最后的SCRNSIZE程式展示了使用这些巨集的方法。使用vsprintf函式,sprintf函式可以这样编写:

int sprintf (char * szBuffer, const

char * szFormat, ...){ int iReturn va_list pArgs va_start

(pArgs, szFormat) iReturn = vsprintf (szBuffer, szFormat, pArgs)

va_end (pArgs) return iReturn }

va_start巨集将pArg设置为指向一个堆叠变数,该变数位址在堆叠参数szFormat的上面。

函数名: vsprintf

功 能: 送格式化输出到串中

用 法: int vsprintf(char *string, char

*format, va_list param)

程序例:

#include

#include

#include

char buffer[80]

int vspf(char *fmt, ...)

{

va_list

argptr

int cnt

va_start(argptr, fmt)

cnt =

vsprintf(buffer, fmt, argptr)

va_end(argptr)

return(cnt)

}

int main(void)

{

int inumber

= 30

float

fnumber = 90.0

char

string[4] = "abc"

vspf("%d %f

%s", inumber, fnumber, string)

printf("%s\n", buffer)

return

0

}

va_list ap

int len

va_start(ap, format)

vsprintf(_this->printfBuf, format, ap)

va_end(ap)

把参数 ap 按照

format 指定的格式,

写到 _this->printfBuf

基本和 sprinf 类似 ......

比如上面给的例子:

vsprintf(buffer, fmt, argptr)

fmt="%d %f %s"

就是把后面的参数按照 "%d %f %s" 这个格式输出到 buffer中

缺少浮点型参数:如果写pair my(100.0, 75)就是默认浮点型。

使用浮点数进行比较,你应该设置一个目标精确度:比如小数点后3位,也就是精确度是:0.001,那么你在比较两个数时比较它们查的绝对值小于0.001就可以,即int型可以用%c输出,输出是字符;反过来char型可以用%d输出,输出是十进制整数。

浮点型函数实参:

函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如: printf("%d",max(x,y))即是把max调用的返回值又作为printf函数的实参来使用的。

在函数调用中还应该注意的一个问题是求值顺序的问题。所谓求值顺序是指对实参表中各量是自左至右使用呢,还是自右至左使用。对此,各系统的规定不一定相同。介绍printf 函数时已提到过,这里从函数调用的角度再强调一下。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8763773.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-20
下一篇2023-04-20

发表评论

登录后才能评论

评论列表(0条)

    保存