返回char * str类型的float的printf val

时间:2019-01-28 15:28:10

标签: c floating-point printf

Possible Duplicate

函数应返回printf类型的float的{​​{1}}值

输入:

char str*

功能

我的函数采用输入字符串char *string = "%f"; float k = 1.0005325678910 和浮点值%f作为将1.0005325678910 的值存储在printf中的输入。这里我无法为{{1 }}

char *answer

预期输出:

char *answer

错误:   为int length(char* string){ int i = 0; while (string[i] != '\0') i++; return i; } char *res(char *string, float k){ int len = length(string); //len is a function which return length of the string char *answer = (char*)malloc(sizeof(char)*len); sprintf(answer,format, n); //printf("%05d", 50); //printf("%s", sqlAnswers); return answer; } 分配内存   输出:1.000533

我的代码不应舍入最后一位。

编辑: 例如:如果我的char *output = 1.000532; ,则预期输出应该为char *answer,但函数float k = 6.143211会舍入最后一位数字。

2 个答案:

答案 0 :(得分:2)

您似乎正在尝试这样做:

#include <stdio.h>
#include <stdlib.h>


char *res(char *format, float k)
{
    //  Ask snprintf to report how many bytes are needed.
    int t = snprintf(NULL, 0, format, k);
    if (t < 0)
    {
        fprintf(stderr, "Encoding error.\n");
        exit(EXIT_FAILURE);
    }

    //  Allocate space for those bytes and a null terminator.
    char *result = malloc(t+1);
    if (!result)
    {
        fprintf(stderr, "Allocation error.\n");
        exit(EXIT_FAILURE);
    }

    //  Format the number.
    snprintf(result, t+1, format, k);

    return result;
}


int main(void)
{
    char *b = res("%f", 1.0005325678910);

    puts(b);

    free(b);
}

答案 1 :(得分:0)

执行此操作的常规C方法是传入char * buf和size_t len。然后返回已经或将要写入缓冲区的字符数。

但是,如果您要编写一个分配适当大小的缓冲区的函数,则有两种选择:

1)始终为“%2f”分配最大大小。考虑到大小可能是最好的。计算适当的大小以在此处或此处保存字节是不值得的CPU开销。

2)使用以下方法找出正确的长度:

char c;
int len = snprintf(&c, 1, "%2f, k);
assert(len >= 0);
++len;

或输出到固定大小的缓冲区,然后使用strdup()。排序为1和2的组合。