2017-04-23 72 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 \n", &i, &j);,而不是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想要跳過更多的空格;但是因爲沒有,它會要求控制檯獲得更多(提示您輸入)。一旦你按下回車鍵,它就會以換行符的形式出現,然後scanf讓你繼續。

另外我想知道爲什麼用這種方式輸入這兩個數字scanf("%d %d ", &i, &j);而不是scanf("%d %d ", i, j);

這是因爲scanf需要修改傳遞給它的整數。在C中,如果你想修改你的參數,那麼你需要傳遞指向該值的指針。如果該值本身被解析並作爲指針,那麼你很可能會遇到分段錯誤。

+0

感謝您的好回答 – ComplicatedPhenomenon

+0

不完全; scanf格式字符串中的空格表示消耗輸入中的所有前導空格。所以「一旦你按下回車鍵」仍然沒有任何反應,它會一直等到輸入一個非空白字符(或發生讀錯誤) –