C 用户定义的printf无法打印浮点值
我有一项任务要做,就是使用类似的函数,如printf,通过使用%f格式化程序格式化并打印浮点值到小数点后两位 我已经试过了,但是输出是空的。请你指出我犯的错误C 用户定义的printf无法打印浮点值,c,C,我有一项任务要做,就是使用类似的函数,如printf,通过使用%f格式化程序格式化并打印浮点值到小数点后两位 我已经试过了,但是输出是空的。请你指出我犯的错误 void printf_for_float(char * fmt, ...) { char * p; float n; va_list v1_float; va_start(v1_float, fmt); for (p = fmt; *p != '\0'; p++) { if (*p
void printf_for_float(char * fmt, ...) {
char * p;
float n;
va_list v1_float;
va_start(v1_float, fmt);
for (p = fmt; *p != '\0'; p++) {
if (*p != '%') {
putchar(*p);
continue;
}
p++;
switch(*p) {
case 'f':
printf(" we are in float area \n" );
n = va_arg(v1_float, float);
n = convert_to_float(n);
puts(convert_float_str(n));
break;
case '%':
putchar('%');
break;
}
}
va_end(v1_float);
}
float convert_to_float(float val) {
return(floorf(val * 100) / 100);
}
char * convert_float_str(float val) {
printf(" the float val in funct convert== %f", val);
char a[sizeof(val)];
memcpy(a, &val, sizeof(float));
printf("the value is %s", a);
return a;
}
int main() {
float test = 64.5555;
printf_for_float("\nmy test = %f", test);
return 0;
}
结果
- 实际o/p 64.550003
- 预期o/p 64.56或64.55
if(*p='%')
应为if(*p!='%')
您希望打印出非%
的字符,并在遇到%
时输入开关
实际发生的情况是,您为所有非%
字符输入了switch语句,而它们没有大小写,因此不会发生任何事情
convert\u float\u str
函数也充满了bug。它需要彻底的重新设计
首先,返回一个指向本地数组的指针。当函数返回时,
被销毁,留下一个悬空指针返回
其次,不要试图将float格式化为字符串。相反,您只需将浮点的字节复制到另一个内存位置。输出为空,因为for循环增加p以指向f(当合适的时间到来时)然后循环中的代码在*p引用开关中的“f”之前再次递增p。float
在传递到vararg列表时隐式转换为double
。。。因此,您可能希望提取一个double
,而不是float。您的代码应该包含一个显示问题的main
函数谢谢Matt的帮助,我将重新设计它,我不能使用snprintf,因为它需要%f。@samprat yes,似乎赋值的主要部分是编写这段代码,输出浮点的十进制表示形式。