#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"
,但这并不能防止您先前输入的匹配失败——理想情况下,您应该在每个输入之后使用 scanf
empty_stdin()
code> 来防止这种情况并为您的下一个输入准备输入缓冲区。)
示例使用/输出
$ ./bin/fnpointer
입력 : 2
choose function : +
입력 : 3
5
关于c - 函数指针 - 变量未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50549368/