2017-04-23 13 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; 
    } 

することにより、これらのコードを入力して、奇妙な何かが起こりました。 2つの数字にタイプした後。原則として文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 \n", &i, &j);を入力目立たない問題を見つけましたか?また、私はなぜこれらの2つの数字をこのようにして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を続けることができます。

また、私はこのようscanf("%d %d ", &i, &j);の代わりscanf("%d %d ", i, j);でなぜ入力をこれら2つの2つの数値をだろうか?

scanfは、渡す整数を変更する必要があるためです。 Cでは、引数を変更したい場合は、値へのポインタを渡す必要があります。値そのものを解析してポインタと見なすと、セグメンテーション違反が発生する可能性が最も高くなります。

+0

あなたの素敵な答えに感謝します – ComplicatedPhenomenon

+0

; scanf形式の文字列中の空白は、入力内のすべての先頭の空白を消費することを意味します。 "一度Enterキーを押すと"何も起こりませんが、空白以外の文字が入力されるまで待機します(または読み込みエラーが発生します) –