Возвращает printf val типа float типа char * str - PullRequest
0 голосов
/ 28 января 2019

Возможный дубликат

Функция должна возвращать printf значение float типа char str*

Входы:

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

Функция:

Моя функция принимает входную строку %f и значение с плавающей запятой 1.0005325678910 в качестве входных данных, сохраняющих значение printf в char *answer. Здесь IЯ не могу выделить память для 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, которая округляет последнюю цифру.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Похоже, вы пытаетесь сделать это:

#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);
}
0 голосов
/ 28 января 2019

Общий способ C сделать это - передать char * buf и size_t len.Затем верните, сколько символов было или было бы записано в буфер.

Но если вы хотите написать функцию, которая выделяет буфер нужного размера, у вас есть 2 варианта:

1) всегда выделяйте максимальный размер для "% 2f".Учитывая размер, который, вероятно, лучший.Не стоит загружать процессор для вычисления правильного размера для сохранения байта здесь или там.

2) найдите правильную длину, используя:

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

или выведите в буфер фиксированного размераи затем используйте strdup ().Сортировка комбинации 1 и 2.

...