1

I am trying to understand function pointers. then I was give an example, I typed these code by self

#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;
  }

then I compiled and executed it, something weird happened. after typing into two numbers. then in principle should followed statement printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n");, but what happened was it was still waiting for me to input number of operation. then that statement printf("0: Add, 1: Subtract, 2: Multiply, 3: Divide\n"); appeared.

I checked the code for a long time. The I found out the inconspicuous problem that I typed scanf("%d %d \n", &i, &j); instead of scanf("%d %d", &i, &j);

It's very likely to be a silly question, but I still need explanation, why the order changed because of that mistake? Also I wonder why input those 2 two numbers in this way scanf("%d %d ", &i, &j); instead of scanf("%d %d ", i, j);?

1 Answer 1

2

scanf is a nasty beast. The difference between using scanf("%d %d ", &i, &j); and scanf("%d %d", &i, &j); is the extra whitespace at the end of the former statement. This makes scanf want to skip more whitespace; but because there isn't any, it asks the console to get more (prompting you for input). Once you press ENTER, it takes that as a newline and gobbles that up - then scanf lets you continue.

Also I wonder why input those 2 two numbers in this way scanf("%d %d ", &i, &j); instead of scanf("%d %d ", i, j);?

This is because scanf needs to modify the integers you are passing to it. In C, if you want to modify your argument then you need to get passed the pointer to the value. If the value itself is parsed and taken as a pointer, then you'd most likely get a segmentation fault.

Sign up to request clarification or add additional context in comments.

1 Comment

Not quite; whitespace in the scanf format string means to consume ALL leading whitespace in the input. So "once you press ENTER" still nothing happens, it will keep waiting until there is a non-whitespace character entered (or read-error happens)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.