我正在尝试理解函数指针。然后我给了example,我自己输入了这些代码
#include <stdio.h>
int sum(int a, int b);
int subtract(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int (*p[4]) (int x, int y);
int main(void)
{
int result;
int i, j, op;
p[0] = sum; /* address of sum() */
p[1] = subtract; /* address of subtract() */
p[2] = mul; /* address of mul() */
p[3] = div; /* address of div() */
printf("Enter two numbers: ");
scanf("%d %d ", &i, &j);
printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n");
do {
printf("Enter number of operation: ");
scanf("%d", &op);
} while(op<0 || op>3);
result = (*p[op]) (i, j);
printf("%d", result);
return 0;
}
int sum(int a, int b)
{
return a + b;
}
int subtract(int a, int b)
{
return a - b;
}
int mul(int a, int b)
{
return a * b;
}
int div(int a, int b)
{
if(b)
return a / b;
else
return 0;
}
然后我编译并执行它,发生了一些奇怪的事情。输入两个数字后。然后原则上应该遵循声明printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n");
,但发生的事情是它还在等我输入操作次数。那个陈述printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n");
出现了。
我检查了很长时间的代码。我发现了我输入scanf("%d %d \n", &i, &j);
而不是scanf("%d %d", &i, &j);
的不明显问题
这很可能是一个愚蠢的问题,但我仍然需要解释,为什么订单因为那个错误而改变了?另外我想知道为什么以这种方式输入这两个数字scanf("%d %d ", &i, &j);
而不是scanf("%d %d ", i, j);
?
答案 0 :(得分:2)
scanf
是一个讨厌的野兽。使用scanf("%d %d ", &i, &j);
和scanf("%d %d", &i, &j);
之间的区别是前一个语句末尾的额外空格。这使得scanf
想要跳过更多的空格;但因为没有,它要求控制台获得更多(提示您输入)。一旦你按下ENTER,它就会把它作为换行符然后吞噬它 - 然后scanf
让你继续。
此外,我想知道为什么以这种方式输入这两个数字
scanf("%d %d ", &i, &j);
而不是scanf("%d %d ", i, j);
?
这是因为scanf
需要修改传递给它的整数。在C中,如果要修改参数,则需要传递指向值的指针。如果值本身被解析并作为指针,那么您很可能会遇到分段错误。