2017-11-30 22 views
0

私はint配列にユーザーから得た数値を入力しようとしています。scanfとEOFを正しく使用する方法は?

しかし、printfより大きい特定のインデックスを試すと、間違った番号が表示されます。

for(B_index=0,checker=0; B_index<SIZE&&!checker; B_index++) 
    { 

     checker=scanf("%d",&B[B_index]); 

     if(checker==EOF) 
     { 
      checker=1; 
     } 

     else if(checker<1) 
     { 
      printf("error"); 
      return 1; 
     } 

    } 
    printf("%d",B[1]); 
+0

これは、C配列はバウンドチェックを行わない、つまり、配列内の要素へのアクセスが配列の範囲外かどうかをコンパイラがチェックしないためです。どうして? 2つの理由があります。1. Cの配列は実行時にポインタに変換されるため、配列の要素へのアクセスはすべてポインタ算術のようなものです。 2.それは言語にスピードを与えるので、信頼性とスピードのトレードオフです。 –

答えて

1

scanfのバック割り当ての数を返すので、コンソール上で有効な整数を入力した場合、scanf関数は、[0] Bに(これは%dに)整数を割り当てられた意味し、1を返します。これによりチェッカーは1になり、最初の番号が入力された直後にループが解除されます。 B [1]は割り当てられていないので、配列を消去した場合はガーベジまたは0が含まれます。

+0

ありがとう – gabi939

関連する問題