scanf格式的基本问题和使用函数指针

时间:2017-04-23 00:33:28

标签: c function-pointers scanf

我正在尝试理解函数指针。然后我给了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);

1 个答案:

答案 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中,如果要修改参数,则需要传递指向值的指针。如果值本身被解析并作为指针,那么您很可能会遇到分段错误。