2017-10-21 24 views
2
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    unsigned int n0; 

    scanf("%d", &n0); 
    const unsigned int n = n0; 
    short unsigned int A[n]; 
    short unsigned int d, x, y, k; 
    short int l, r; 
    int i, j; 

    for (i = 0; i < n; i++) { 
     scanf("%d", &A[i]); 
    } 

    scanf("%d", &d); 
    for (i = 1; i <= d; i++) { 
     scanf("%d %d", &x, &y); 
    } 
    return 0; 
} 

こんにちは、私はCでの初心者で、私をたくさん驚かせる状況に遭遇しました。上記のコードでは、ユーザにある数字dを入力してから、dのポイント座標を入力するように頼みたいと思います。しかし、驚いたことに、1より大きいdの値が最初に入力されても、(x、y)の最初のペアを入力した後にプログラムが実行を終了します。コード内でdに値を割り当てると、それは起こりません(e.x. d = 5;)。理由は何でしょうか? scanfステートメントを介して変数に割り当てられた値は、何らかの形で異なり、ループ状態で使用できませんか?scanfで可変入力のループ条件 - C

+0

これは '(I = 0; iがn <;私は++)のためにはどのような?{ のscanf( "%d個"、&A[i]); }'意味 –

+0

@xing、それが、おかげで働いていた!しかし、なぜ実際に%Dのdoesn – jakes

+0

@KrzysztofSzewczyk、それはさらなる機能のためのものです、私はここでそれを削除することを忘れました。 – jakes

答えて

1

コードをコンパイルするときに生じる警告に注意してください。次のように警告の一つは、次のようになります。

a.c:19:12: warning: format specifies type 'int *' but the argument has type 
    'unsigned short *' [-Wformat] 
scanf("%d",&d); 
     ~~ ^~ 
     %hd 

未定義の動作につながる、intへのポインタとしてshortへのポインタをキャストscanf%d原因を使用します。あなたのケースのように、の上部はshortに格納され、下部は落とされます。数字undef 2 の場合、上部はゼロであるため、後続のループはゼロ回反復します。ループ変数shortを作るための正当な理由がない:すべての警告を修正

は、この問題

scanf("%hu", &d); 
... // Fix other scanf calls as well. 

注意を排除します。

+1

あなたの徹底的な説明をありがとう! – jakes