2016-09-01 6 views
0

これはユーザーが一連の番号を入力して追加する簡単なプログラムです。結果は画面に表示されます。コードは次のとおりです。ScanfはC言語で繰り返します

int main() { 
int * numbers; 
int result = 0; 
int howMany; 
int i; 

printf("How many numbers would you like to add?\n"); 
scanf(" %d\n", &howMany); 

numbers = (int *) malloc(howMany * sizeof(int)); 

for(i = 0; i < howMany; i++){ 
    printf("Please enter number %d.\n", i + 1); 
    scanf(" %d\n", &numbers[i]); 
    result = result + numbers [i]; 
} 
printf("Result: %d", result); 
return 0; 
} 

問題があります。このプログラムは何らかの理由で2回追加したい数字の数を入力します。何故ですか?どうすれば修正できますか? また、これが関連しているかどうかはわかりませんが、結果も意味がありません。ときどき彼らは正しい、他の時代はそうではない、どちらかといえば確信していない。おかげさまで

+2

'scanf'の'%d'の後の '%d'と' \ n'の前の空白の目的は何ですか? – haccks

+6

'\ n'を' scanf'文から削除すれば、それは正常に動作します( 'scanf'の戻り値をチェックすることになりますが、それは別の問題です)。 –

+2

ステップ1:コードが 'scanf()'に問題があるときはいつでも、その戻り値を確認してください。それはここで問題を解決することはありませんが、最初に試してみるべきです。 – chux

答えて

2

プログラムユーザーが何らかの理由で二回追加したいと思いますどのように多くの数字を要求します。何故ですか?どうすれば修正できますか?

あなたのプログラムでは、いくつの番号が1回だけ表示されます。しかし、入力した後でなければ、それぞれの特定の番号を尋ねることを延期します。そして、結果を出力する前に最後の(遅い)プロンプトの後に空白以外の行を追加する必要があります。

また、これが関連しているかどうかは不明ですが、結果も意味をなさないときどき彼らは正しい、他の時代はそうではない、どちらかといえば確信していない。

関連性:番号ごとのプロンプトが遅いという事実は、どの番号が追加されているのか混乱させることです。

@マークが(すでにやや簡潔ではありますが)既に述べたように、これはすべてscanf()の形式になります。 scanf()形式での空白の空でない行の実行(改行を含む)は空白の可能性のある空の実行と一致します。このような実行に一致する場合、scanf()は空白以外の文字が表示されるまでスキャンを続ける必要があります。ただし、インタラクティブ入力はラインバッファで処理されるため、改行をまったく送信しない限り、新しい入力は使用できません。その次の行の最初の空白以外の文字は、の後に、scanf()の順で待機します。

scanf()は、特に対話型入力では、正しく使用するのが難しい場合があります。固定フォーマット入力に最適です。あなたはを使用して入力を1行ずつ読み込み、sscanf()(あるいはあなたの選択した他の仕組み)を使って各行を解析することが推奨されています。それでも弾丸を作ることは難しいかもしれませんが、より強固な発想から始めましょう。

0

問題は、printf関数とscanf関数で改行文字が間違って配置されたためです。ここで

は、おそらく探しているコードです:

int main() { 
    int * numbers; 
    int result = 0; 
    int howMany; 
    int i; 

    printf("How many numbers would you like to add?: "); 
    scanf("%d", &howMany); 

    numbers = (int *) malloc(howMany * sizeof(int)); 

    for(i = 0; i < howMany; i++){ 
    printf("Please enter number %d: ", i + 1); 
    scanf("%d", &numbers[i]); 
    result = result + numbers [i]; 
    } 
    printf("Result: %d\n", result); 
    return 0; 
} 
+1

scanf()をまったく使用しないと、さらに頑強になります;-) – usr

+0

@usr - true - 'scanf()'は暗い暗い沼地の沼地に住んでいます。 – chux

関連する問題