尽管使用了合适的说明符,C程序仍然无法编译?

时间:2015-10-01 14:29:42

标签: c scanf format-specifiers

由于我目前无法理解的原因,尽管拥有完成任务所需的一切,但此代码仍无法编译。

#include <stdio.h>      /* printf */
#include <math.h>


double resistance;
double voltage;
double current;
double wattage;
int main()
{

    printf("type in resistance\n");
    scanf("%f",resistance);
    printf("type in current");
    scanf("%f",current);
    //voltage = resistance*resistance*current;
    printf("%f Volts",resistance*resistance*current);

    //  return voltage;
}

我不明白的是为什么它会被编译?我一直在&#34; 错误的说明符&#34;编译时的消息。我尝试了%lf%f,但它们都不起作用。

4 个答案:

答案 0 :(得分:4)

您希望使用scanf为双变量分配浮动值。参数需要是指针:

use std::slice;

type IterBox<'a> = Box<Iterator<Item=&'a i32> + 'a>;

trait Trait {
    fn iter<'a>(&'a self) -> IterBox;
}

struct Struct<'a, T: 'a> {
    items: Vec<&'a T>
}

impl<'a, T: 'a> Struct<'a, T> {
    fn iter(&self) -> slice::Iter<i32> {
        unimplemented!()
    }
}

impl<'a, T: 'a> Trait for Struct<'a, T> {
    fn iter(&self) -> IterBox {
        Box::new(self.iter())
    }
}

fn main() {
    let i = 3;
    let v = vec![&i];
    let mut traits: Vec<Box<Trait>> = Vec::new();
    traits.push(Box::new(Struct { items: v }));
}

答案 1 :(得分:4)

更改行

scanf("%f",resistance);
scanf("%f",current);

scanf("%lf", &resistance);
scanf("%lf", &current);

%f转换说明符期望相应的参数具有类型float *,但表达式resistancecurrent都具有类型double。表达式&resistance&current的类型为double *,因此您需要使用%lf转换说明符(需要类型为double *的参数)。

答案 2 :(得分:2)

不是printf,而是scanf:

scanf("%f", resistance);

这应该是:

scanf("%lf", &resistance);

%lf因为它是双重的,%f适用于花车。而&resistance因为scanf期望指向任何东西,所以它可以在那里写。当你写%f时,printf只需一个浮点数,scanf指向浮点数。 %lf及其double / double*

答案 3 :(得分:1)

根据C99的标准,float没有独占格式说明符。无论你使用浮点数还是双数,它都不算数。重要的是当你使用float变量时,printf会自动将它升级为double并显示它。因此%f表示双精度值或浮点值,%Lf表示长双精度值。

参考:http://www.cplusplus.com/reference/cstdio/printf/

int main() {

   printf("Type in Resistance: ");
   scanf("%lf", &resistance);
   printf("Type in Current: ");
   scanf("%lf", &current);
   printf("%f Volts",resistance*resistance*current);
}