Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用户定义的printf无法打印浮点值_C - Fatal编程技术网

C 用户定义的printf无法打印浮点值

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

我有一项任务要做,就是使用类似的函数,如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 != '%') {
            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,似乎赋值的主要部分是编写这段代码,输出浮点的十进制表示形式。