【问题标题】:Return printf val of float of type char *str返回 char *str 类型的 float 的 printf 值
【发布时间】:2019-06-21 15:28:43
【问题描述】:

Possible Duplicate

函数应该返回 float 类型的 printfchar str*

输入:

char *string = "%f";
float k = 1.0005325678910

功能:

我的函数将输入字符串%f 和浮点值1.0005325678910 作为输入,将printf 的值存储在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;
 }

预期输出:

char *output =  1.000532;

错误: 将内存分配给char *answer 输出:1.000533

我的代码不应四舍五入。

编辑: 例如:如果我的 float k = 6.143211预期输出 应该是 6.14 但函数 returns 6.15 会将最后一位数字舍入。

【问题讨论】:

  • 你忘记了 C 中的 char 字符串实际上称为 null-terminated 字节字符串。而且您还需要为 null-terminator 留出空间。
  • 至于您的问题,请尝试创建一个合适的minimal reproducible example 向我们展示。阅读how to ask good questionsthis question checklist。任何地方都没有问题,没有关于你的“错误”的解释,或者你展示的代码会发生什么,或者应该发生什么。等等。
  • 您假设传递的字符串大小适合sprintf 的输出。 len(string); 和它有什么关系?
  • 另外,请注意,说明符 "%2f" 确实防止 sprintf 的输出溢出。
  • int len = len(string);高度混乱。不要这样做。

标签: c floating-point printf


【解决方案1】:

您似乎正在尝试这样做:

#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);
}

【讨论】:

    【解决方案2】:

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

    但是,如果您想编写一个分配正确大小的缓冲区的函数,您有两种选择:

    1) 始终为“%2f”分配最大大小。考虑到可能是最好的尺寸。计算正确的大小以在这里或那里保存一个字节是不值得的。

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 2020-04-27
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      相关资源
      最近更新 更多