Указатель на функцию - переменная не инициализирована - PullRequest
0 голосов
/ 27 мая 2018
#include <stdio.h>

int Calc(int n1, int n2, int(*func) (int n1, int n2))
{
    return func(n1, n2);
}

int Plus(int n1, int n2)
{
    return n1 + n2;
}

int Minus(int n1, int n2)
{
    return n1 - n2;
}

int main(void)
{
    int n1, n2;
    int result;
    char mark;

    printf("입력 : ");
    scanf_s("%d", &n1);
    printf("choose function : ");
    scanf_s("%c", &mark, sizeof(mark));
    printf("입력 : ");
    scanf_s("%d", &n2);

    switch (mark)
    {
    case '+':
        result = Calc(n1, n2, Plus);
    case '-':
        result = Calc(n1, n2, Minus);
    }
    printf("%d\n", result);

    return 0;
}

Я изучаю Function Pointer в C с простым кодом.Я заставил его инициализировать переменный результат с помощью scanf_s, но он отправил мне сообщение об ошибке, сообщающее, что переменный результат не инициализирован.Как я могу исправить этот код?

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

У вас есть две проблемы:

1. вы оставляете '\n' во входном буфере после scanf_s("%d", &n1);, который затем принимается как ваш ввод для scanf_s("%c", &mark, sizeof(mark)); Вы должны удалитьзавершающий перевод новой строки перед попыткой чтения с "%c".Подойдет простая функция empty_stdin,

например,

#include <stdio.h>

void empty_stdin ()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}
...
    printf("입력 : ");
    scanf_s("%d", &n1);
    empty_stdin();           /* remove all extraneous chars from stdin */
    printf("choose function : ");
    scanf_s("%c", &mark, sizeof(mark));

2. Вы не можете включить break в конце каждого switch случая, вызывающегоавтоматический переход к следующему switch делу, вам нужно,

например

    switch (mark)
    {
    case '+':
        result = Calc(n1, n2, Plus);
        break;
    case '-':
        result = Calc(n1, n2, Minus);
        break;
    }

Если положить его в целом, вы можете сделать:

#include <stdio.h>

void empty_stdin ()
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

int Calc(int n1, int n2, int(*func) (int n1, int n2))
{
    return func(n1, n2);
}

int Plus(int n1, int n2)
{
    return n1 + n2;
}

int Minus(int n1, int n2)
{
    return n1 - n2;
}

int main(void)
{
    int n1, n2;
    int result = 0;
    char mark;

    printf("입력 : ");
    scanf_s("%d", &n1);
    empty_stdin();
    printf("choose function : ");
    scanf_s("%c", &mark, sizeof(mark));
    printf("입력 : ");
    scanf_s("%d", &n2);

    switch (mark)
    {
    case '+':
        result = Calc(n1, n2, Plus);
        break;
    case '-':
        result = Calc(n1, n2, Minus);
        break;
    }
    printf("%d\n", result);

    return 0;
}

( ПРИМЕЧАНИЕ: Вы также должны проверить return каждого scanf, чтобы убедиться, что у вас есть действительный ввод - это оставлено вам. Также обратите внимание, что вы можете игнорироватьведущий пробел - включая '\n' - путем включения пробела перед указателем формата, например, " %c", но это не защищает от сбоя , соответствующего от вашего предыдущего ввода- в идеале вы должны empty_stdin() следовать за каждым вводом с помощью scanf, чтобы защитить от этого случая и подготовить буфер ввода для вашего следующего ввода.)

Пример использования / Вывод

$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5
0 голосов
/ 27 мая 2018

Вы не инициализировали переменную результата, вы использовали scanf_s для n1, n2, но вы ничего не сделали с результатом, поэтому компилятор жалуется на

...