C: Ошибка: «формат«% f »ожидает аргумент типа« double »» - PullRequest
0 голосов
/ 26 февраля 2019

Я возвращаюсь к C и только что выполнил несколько небольших упражнений, и я наткнулся на это и не могу понять причину, по которой это происходит ??

Программа занимает 9 словпример длинного кода "011112222".Первое число - это код операции (0 для +, 1 для -, 2 для *, 3 для /), следующие 4 числа - это первое число, а остальные 4 - другое число, поэтому для "011112222" результат должен быть1111 + 2222.

Но я получаю постоянную ошибку: В функции 'main':

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 голосов
/ 26 февраля 2019

В вашем printf вызове:

printf("%f", result);

Спецификатор формата %f ожидает double (или float, который автоматически конвертируется), но вы передаете его указатель на число с плавающей запятой.Вам нужно разыменовать указатель, чтобы получить значение float:

printf("%f", *result);

Однако , у вас есть другая проблема.

Внутри Calculate вы определяете result, то есть то, что вы возвращаете из функции, как указатель на float, но вы никогда не устанавливаете его так, чтобы он указывал куда-либо.Поэтому всякий раз, когда вы пытаетесь разыменовать этот указатель, вы читаете неинициализированное значение и используете его в качестве действительного указателя.Это вызывает неопределенное поведение .

Нет смысла использовать указатель на float в вашем коде, поэтому измените оба result в main и result в Calculate с float * на float и измените Calculate, чтобы получить float.

. Кроме того, функция strncpy не всегда завершает строку назначения нулем, а mallocвозвращает неинициализированную память, поэтому atoi может читать после окончания выделенной памяти при чтении строк.Вы можете исправить это, используя calloc вместо malloc, который возвращает память, инициализированную для всех 0.Кроме того, обязательно free эти буферы, когда вы закончите с ними.

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

    char *firstPart = calloc(strlen(buffer), 1);
    char *secondPart = calloc(strlen(buffer), 1);

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

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

    free(firstPart);
    free(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;
}
0 голосов
/ 26 февраля 2019

Ваш код требует много проверок и изменений, чтобы быть надежным, но я внес несколько изменений, чтобы достичь вашей первоначальной цели.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...