c - 函数指针 - 变量未初始化

标签 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 使它初始化变量结果,但它向我发送一条错误消息,通知我变量结果未初始化。我该如何修复此代码?

最佳答案

你有两个问题:

1. 你在 scanf_s("%d", &n1); 之后将 '\n' 留在输入缓冲区中,然后作为您对 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. 您未能在每个 switch 案例的末尾包含 break,导致自动 fall-through到下一个 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",但这并不能防止您先前输入的匹配失败——理想情况下,您应该在每个输入之后使用 scanfempty_stdin() code> 来防止这种情况并为您的下一个输入准备输入缓冲区。)

示例使用/输出

$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5

关于c - 函数指针 - 变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549368/

相关文章:

c - stdin 的 fscanf 不提示输入

c - scanf 返回值的使用

c - 尝试通过插入从文件流检索的字符来创建二维数组

c -/proc/self/映射到实际代码的段

c - 家庭成员结构,C

c - 有没有一种简单的方法可以从文件中读取未经验证的十进制值?

c - C 中的 do while 语句

c - 在 Eclipse 中构建 Makefile 项目的步骤

c - 打印链表内容只打印第一个节点

c - 在确定数组大小时,括号是否有所不同?