2017-06-23 16 views
0

scanf関数でuserNumberへの参照を省略した場合、このプログラムが機能しなくなるのはなぜですか?scanf()の変数への参照を省略すると、プログラムの動作が停止します。どうしてこれなの?

#include <stdio.h> 

int main() 
{ 
    int userNumber; 

    printf("Enter a number: "); 
    scanf("%d", &userNumber); 

    while (userNumber != 10) 
    { 
     printf("\nWrong number. Try again\n"); 
     printf("\nEnter a number: "); 
     scanf("%d", &userNumber); 
    } 
    return 0; 
} 
+0

*を? –

+0

'scanf("%d ");'と書くだけであれば**これは**未定義の動作です**。言語には、各変換指定子の結果を受け取るためのパラメータが必要です。 –

+1

サイドノート:Cは参照をサポートしていません。 'scanf'へのポインタを渡します。 – Olaf

答えて

2

scanf("%d")ので、あなたが本当に書く必要があり、その2番目の引数としてポインタを渡す必要があります。

int userNumber; 
scanf("%d", &userNumber); 

あなたが参照を取る場合は、入力が正しく読まれていない、とuserNumberが実際にあります未初期化未定義動作、これはおそらくあなたの目撃者の動作を説明します。

あなたが最初のscanfからの参照削除していた場合は、警告を見ている必要があります:あなたは*何* *を除外ん

Georgioss-MacBook-Pro:~ gsamaras$ gcc main.c 
main.c:8:17: warning: format specifies type 'int *' but the argument has type 
     'int' [-Wformat] 
    scanf("%d", userNumber); 
      ~~ ^~~~~~~~~~ 
1 warning generated. 
+0

uhm。 *プロトタイプ*ではありません。プロトタイプは 'scanf()'の場合には何も教えてくれません。 –

+0

@FelixPalmenええ、あなたは正しい、更新されました、あなたはそれを今好きですか? – gsamaras

+0

私のdownvoteではない、そのような奇妙な質問のための良いenogh ...しかし、正確には、* 2番目の議論は全く必要ありません。要件は、 '*'で抑制されていない書式文字列内の各変換のためのポインタを渡さなければならないということです。 (したがって、フォーマット文字列として '%d'を使用すると、2番目の引数*は必須です) –

関連する問題