功能指针 - 未初始化的变量

时间:2018-05-27 05:44:31

标签: c scanf

#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;
}

我正在用简单的代码学习C中的函数指针。我使用scanf_s初始化变量结果,但是它向我发送了一条错误消息,通知我变量result未初始化。我该如何修复此代码?

2 个答案:

答案 0 :(得分:2)

你有两个问题:

1。您在'\n'之后将scanf_s("%d", &n1);留在输入缓冲区中,然后将其作为scanf_s("%c", &mark, sizeof(mark));的输入。您必须在尝试之前删除尾随换行符阅读"%c"。一个简单的empty_stdin函数就可以了,

e.g。

#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,导致自动直通到下一个{{1}例如,你需要,

e.g。

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; } 返回以确保您有有效的输入 - 这是留给您的。另请注意,您可以忽略前导空白 - 包括scanf - 在格式说明符之前加一个空格,例如'\n',但这不能防止匹配先前输入失败 - 理想情况下,您应" %c"使用empty_stdin()跟踪每个输入,以防止出现这种情况,并为下一次输入准备好输入缓冲区。)

示例使用/输出

scanf

答案 1 :(得分:0)

你没有初始化结果变量,你使用scanf_s表示n1,n2,但你没有对结果做任何事情,所以编译器抱怨