C程序将浮点值作为命令行参数,因此需要从string格式化为float然后再格式化为整数。使用math.h中的round(),然后想要转换为int。
通过在值之前声明(int)进行强制转换,但值类型不会更改。
以下代码:
double *f = (double *) malloc(sizeof(double));
*f = (int)roundf(atof(argv[1]));
printf("Testing f: %d", *f);
make
会显示以下错误消息:
format specifies type 'int' but the argument has type 'double'
[-Werror,-Wformat]
printf("Testing f: %d", *f);
答案 0 :(得分:3)
您将int
放入double
。 f
变量的类型应为int
。
int f;
f = (int)roundf(atof(argv[1]));
答案 1 :(得分:1)
C有一种直接的方法可以将转换为将float
转换为整数类型
long int lround(double x);
lround
和llround
函数将它们的参数四舍五入到最接近的整数值,无论当前的舍入方向如何,都将中间情况四舍五入。 ...... C11 7.12.9.7 2
#include <math.h>
#include <stdlib.h>
long i = lround(atof(argv[1]));
// or
float f = atof(argv[1]);
long i = lroundf(f);
// Use %.0f to print a FP with no factional digits.
printf("%.0f\n", f);
// Use %ld to print a `long`
printf("%ld\n", i);
答案 2 :(得分:1)
错误位于 printf 函数的%d 格式说明符中:
printf("Testing f: %d", *f); /* %d expects an integer but *f is a double */
* f 包含一个四舍五入的数字并不重要,就 printf 而言,它仍然是一个双倍。
试试这个:
printf("testing f: %d", (int)*f);
N.B。为什么你要使用malloc来分配一个double呢?如果你只需要将一个双精度传递给其他程序,你就可以:
double f;
... stuff ...
foo(&f);