#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未初始化。我该如何修复此代码?
答案 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,但你没有对结果做任何事情,所以编译器抱怨