Зарегистрировать функцию печати - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно зарегистрировать функцию печати для фрактальной части печати с плавающей точкой xxx.yy -> yy

Но это не работает так, как нужно.Я думаю, что это проблема с указателем, но я не могу понять, где проблема.

int  print_fr (FILE *stream,const struct printf_info *info
                        ,const void *const *args)
{
  char *buffer;
  const float ff = *((const float *) (args[0]));

  printf("%f\n", ff); // if 123.45 -> -107374184.000000

  double fract_part, int_part;
  fract_part = modf(ff, &int_part);
  int len = asprintf (&buffer, "%.0f",fract_part);

  if (len == -1) return -1;

  len = fprintf (stream, "%*s",
                  (info->left ? -info->width : info->width),
                  buffer);
  free (buffer);
  return len;
}

int  print_fr_arginfo (const struct printf_info *info, size_t n
                       ,int *argtypes)
{
   if (n > 0)
       argtypes[0] = PA_FLOAT;
     return 1;
}

main.c

 /* Register the print function */
 register_printf_function ('w', print_ff, print_ff_arginfo);

 printf("%w\n", 123.45); // result -0

1 Ответ

0 голосов
/ 21 сентября 2019

, чтобы просто напечатать дробную часть значения с плавающей запятой ::

#include <math.h>  // floorf()
float integerNum = floorf( originalFloat );
float fractNum = originalFloat - integerNum;
printf( "%f\n", fractNum );
...