Float被视为双重

时间:2015-09-04 20:26:40

标签: c

使用Xcode运行这个小C脚本时,我收到此消息:

  

Format specifies type 'float *' but the argument has type 'double" at scanf("%f", v) and scanf("%f", i).

我没有得到它,因为我没有声明任何double类型变量。

int main(int argc, const char * argv[]) {
    char choice[10];

    float v;
    float i;
    float r;

    printf("What would you like to calculate?: ");
    scanf("%s", choice);
    printf("\nYou chose: \n""%s", choice);

    if (strcmp(choice, "r") == 0)
    { 
        printf("\nPlease enter voltage (V): \n");
        scanf("%f", v);

        printf("\nPlease enter current (I): \n");
        scanf("%f", i);

        r = v/i;

        printf("%f", r);
    }
}

有什么想法吗?

4 个答案:

答案 0 :(得分:6)

您收到该警告是因为您未能将指针传递给函数float*的浮点(scanf)。编译器告诉您它是双精度因为scanfvariadic function。变量参数受默认参数提升的约束,其中某些数据类型的参数被转换为更大的数据类型。在这种情况下,float会提升为double

C中的函数修改变量vichoice的唯一方法是将它们作为指针传递,因此您需要将指针传递给{{1} },使用scanf"地址"操作

您的代码应如下所示:

&

另请注意,我使用了格式说明符int main(int argc, const char * argv[]) { char choice[10]; float v; float i; float r; printf("What would you like to calculate?: "); scanf("%9s", &choice); /* this specifier prevents overruns */ printf("\nYou chose: \n""%s", choice); if (strcmp(choice, "r") == 0) { printf("\nPlease enter voltage (V): \n"); scanf("%f", &v); /* use a pointer to the original memory */ printf("\nPlease enter current (I): \n"); scanf("%f", &i); /* use a pointer to the original memory */ r = v/i; printf("%f", r); } } 。这样,如果用户输入超过9个字符,相邻的内存将不会被覆盖。您必须为空字符%9s保留数组的最后一个元素,因为C中的字符串以\0结尾。

答案 1 :(得分:4)

  

我没有得到它,因为我没有声明任何双重类型变量。

如果没有可见的原型来指示函数对给定参数的期望类型,或者当该参数属于一组可变参数时,则对该参数执行默认参数提升。这提供了与ANSI C之前的代码的兼容性,该代码假设在所有参数上执行了此类促销。

在这种情况下,scanf()是可变的,具有这个原型:

int scanf(const char *fmt, ...);

所以除格式之外的所有内容都受默认参数提升的影响。对于float类型的参数,这是double的促销,而double来自的地方。

当然,正如其他答案所描述的那样,你根本不应该传递float,而应该是指向它的指针。

答案 2 :(得分:2)

您必须使用&运算符。例如,将scanf("%f", v);替换为scanf("%f", &v);。这会将变量的地址(而不是值)传递给scanf()

答案 3 :(得分:2)

您必须编写scanf("%f", &i); e.t.c,因为您希望将变量作为指针传递,因为C没有像C ++这样的引用类型