我使用转换说明符错了什么? scanf()不在c中工作

时间:2017-05-19 06:21:12

标签: c scanf

当我在c:

中使用以下代码行时,

scanf()无法正常工作

double withdraw = 0;

scanf("%.2lf",&withdraw);

printf("\n\nWithdraw %.2lf?",&withdraw);

和此:

double withdraw = 0;

scanf("%.2lf",withdraw);

printf("\n\nWithdraw %.2lf?",withdraw);

和此:

double withdraw = 0;

scanf("%.2lf",&withdraw);

printf("\n\nWithdraw %.2lf?",withdraw);

最后这个:

double withdraw = 0;

scanf("%.2lf",withdraw);

printf("\n\nWithdraw %.2lf?",&withdraw);

输入到scanf()总是这样:

1

退出的输出总是这样:

0.00

请帮忙。这对我来说太疯狂了!

3 个答案:

答案 0 :(得分:4)

是的,你的代码错了。您不能对".<int>"系列使用精度fscanf()),这是无效的。这会导致undefined behavior

引用C11,章节§7.21.6.2/ p3, fscanf()

  

每个转换规范都由字符%引入。   在%之后,以下顺序出现:

     

- 可选分配抑制字符*

     

- 大于零的可选十进制整数,指定最大字段宽度   (字符)。

     

- 可选长度修饰符,用于指定接收对象的大小。

     

- 转换说明符字符,指定要应用的转换类型。

和,p13

  

如果转换规范无效,则行为未定义。

那就是说,不要使用反复试验,undefined behaviors很难捕捉和理解。阅读手册页,了解任何参数类型的正确格式说明符。

答案 1 :(得分:0)

正如你的编译器告诉你的那样

warning: unknown conversion type character ‘.’ in format [-Wformat=]

因此,您无法使用此类型的格式说明符

指定精度

答案 2 :(得分:0)

以下内容可行。

#include <stdio.h>
#include <math.h>

int main()
{
    double withdraw = 0;

    scanf("%lf", &withdraw);
    printf("\n\nWithdraw %.2lf?", withdraw);

    return 0;
}