2017-04-23 3 views
1

함수 포인터를 이해하려고합니다. 그때는 example을 제공했다, 내가 scanf 형식의 기본 문제 및 함수 포인터 사용

#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", &i, &j); 대신

바보 같은 질문 일 가능성이 매우 높습니다. 그러나 그 이유 때문에 순서가 왜 변 했는가? 또한 나는 왜이 두 개의 숫자를 이런 식으로 scanf("%d %d ", &i, &j); 대신 scanf("%d %d ", i, j); 대신에 입력해야하는지 궁금합니다.

답변

2

scanf은 더러운 짐승입니다. scanf("%d %d ", &i, &j);scanf("%d %d", &i, &j);을 사용하는 것의 차이점은 이전 명령문 끝의 추가 공백입니다. 이로 인해 scanf은 공백을 더 건너 뛰고 싶습니다. 하지만 아무 것도 없으므로 콘솔에 더 많은 것을 요구합니다 (입력을 요구합니다). ENTER를 누르면, 줄 바꿈으로 그 값이 올라갑니다. 그러면 scanf을 계속 사용할 수 있습니다.

도 왜이 2 개의 숫자를이 방법으로 scanf("%d %d ", &i, &j); 대신 scanf("%d %d ", i, j); 대신 입력해야하는지 궁금합니다.

scanf은 전달할 정수를 수정해야하기 때문입니다. C에서 인수를 수정하려면 값에 포인터를 전달해야합니다. 값 자체가 파싱되어 포인터로 사용되면 세그먼트 오류가 발생할 가능성이 큽니다.

+0

좋은 답변 주셔서 감사합니다 – ComplicatedPhenomenon

+0

아닙니다. scanf 형식 문자열의 공백은 입력에서 선행 공백을 모두 소비한다는 것을 의미합니다. 그래서 "한번 ENTER를 누르면"아무 일도 일어나지 않는다. 공백이 아닌 문자가 입력 될 때까지 기다린다 (또는 읽기 오류가 발생한다) –