C:错误:“格式'%f'期望类型为'double'的参数”

时间:2019-02-26 19:44:52

标签: c

我回到C上,只是做了一些小练习,而我偶然发现了这一小题,而无法弄清为什么会这样?

该程序采用9字长的代码示例“ 011112222”。第一个数字是操作代码(0表示+,1表示-,2表示*,3表示/),接下来的4个数字是第一个数字,其他4个是其他数字,因此对于“ 011112222”,结果应为1111 + 2222。

但是我得到一个持续的错误: 在“主要”功能中:

zadatak.c:54:14: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘float *’ [-Wformat=]
     printf("%f", result);

如果有人可以阐明这个问题,那就太好了,我将不胜感激。

#include<stdio.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <string.h>

    float* Calculate(char* buffer)
    {
        int number1, number2;

        char *firstPart = (char *)malloc(strlen(buffer));
        char *secondPart = (char *)malloc(strlen(buffer));

        strncpy(firstPart, buffer+1, 4);
        strncpy(secondPart, buffer+5, 8);

        number1 = atoi(firstPart);
        number2 = atoi(secondPart);

        float *result;

        if( buffer[0] == '0')
        {
            *result = (float)number1 + (float)number2;
        }
        else if(buffer[0] == '1')
        {
            *result = (float)number1 - (float)number2;
        }
        else if(buffer[0] == '2')
        {
            *result = (float)number1 * (float)number2;
        }
        else if(buffer[0] == '3')
        {
            *result = (float)number1 / (float)number2;
        }

        return result;
    }

    int main()
    {
        char buffer[20];
        printf("Insert code word: ");
        scanf("%s", buffer);

        float *result = Calculate(buffer);
        printf("%f", result);

        return 1;
    }

2 个答案:

答案 0 :(得分:2)

在您的printf通话中:

printf("%f", result);

%f格式说明符期望使用double(或自动转换的float),但是您要向浮点数传递指针 。您需要取消引用指针以获取float值:

printf("%f", *result);

但是,您还有另一个问题。

Calculate内,您定义了result,这是您从函数返回的内容,作为指向float的指针,但是您从未将其设置为指向任何地方。因此,无论何时尝试取消引用该指针,您都在读取未初始化的值并将其用作有效指针。这样做会调用undefined behavior

没有理由在代码中使用指向float的指针,因此将{{1}中的resultmain中的result从{{ 1}}更改为Calculate,然后更改float *以返回float

此外,Calculate函数并不总是以null终止目标字符串,并且float返回未初始化的内存,因此strncpy在读取时可以读取已分配内存的末尾弦。您可以使用malloc而不是atoi来解决此问题,这将返回初始化为全0的内存。另外,在使用完这些缓冲区后,请确保calloc

malloc

答案 1 :(得分:0)

您的代码需要进行很多验证和更改才能可靠,但是我为实现您的最初目的所做的更改很少。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

float Calculate(char* buffer)
{
    int number1, number2;

    char *firstPart = (char *)malloc(strlen(buffer));
    char *secondPart = (char *)malloc(strlen(buffer));
    float result;

    strncpy(firstPart, buffer + 1, 4);
    strncpy(secondPart, buffer + 5, 4);
    number1 = atoi(firstPart);
    number2 = atoi(secondPart);


    if( buffer[0] == '0')
    {
        result = (float)number1 + (float)number2;
    }
    else if(buffer[0] == '1')
    {
        result = (float)number1 - (float)number2;
    }
    else if(buffer[0] == '2')
    {
        result = (float)number1 * (float)number2;
    }
    else if(buffer[0] == '3')
    {
        result = (float)number1 / (float)number2;
    }

    free(firstPart);
    free(secondPart);

    return result;
}

int main()
{
    char buffer[20];
    printf("Insert code word: ");
    scanf("%s", buffer);

    float result = Calculate(buffer);
    printf("%f", result);

    return 1;
}