2017-01-16 6 views
1

なぜではなく、scanf("%type",array[x])の変数に配列のような変数を渡す必要があるのですが、ポインタが "別のアドレスを指すことができない特別なポインタ"と思われます。誰かが私を明確にすることを願って。配列をscanfの関数と変数に渡す

もう1つのコードには2つの簡単なコードがあります。どちらがいいですか ? クリーンなコーディングに興味がありますが、まだ初心者です。

for(_a_i = 0; _a_i < _a_size; _a_i++) { 

    int _a_item; 
    scanf("%d", &_a_item); 
    _a[_a_i] = _a_item; 

} 

他方

for(_a_i = 0; _a_i < _a_size; _a_i++) { 

      scanf("%d", &_a[_a_i]); 

     } 
+3

すべての変数名は、_horrible_です。申し訳ありません。 –

+1

'scanf'は配列を直接読み取ることができません。各配列メンバーを個別にスキャンする必要があります。それがscanfの仕組みです。 –

+0

私はきれいなコーディングメモリ管理とパフォーマンスではなく、変数名ではなく、変数名はhakerrankサイトから@SouravGhosh – root

答えて

1

なぜ私はscanf("%type",&array[x])機能、ないscanf("%type",array[x])の変数のような配列を渡す必要があり、...?

arrayは、アレイです。添字演算子[]は、配列array[x]の要素を指定します。

array[x]intであるとします。 &array[x]は、intのアドレスであり、単一のintです。

私はscanf("%type",array[x])のようにintscanf("%type",&array[x])内の関数ではなく、intのアドレスを渡す必要がなぜ問題はその後、

なり...? intへの入力テキスト変換を保存する場所ののアドレスを知っている必要がありscanf()

。関数へのすべての引数は値で受け取られます。

関数呼び出しの前にarray[x] = 42;とします。 scanf("%type",array[x])のようにintの値を渡すと、変換を格納する場所の情報はscanf()にはなりません。 scanf("%type", 42)と同じで、確かに結果をarray[x]に保存する情報はありません。


「クリーンコーディング」について。両方のコードスニペットでは、scanf()の結果はチェックされません。これは大きな欠点です。そのチェックコードがなければ、スキャンの成功を知ることはできません。

if (scanf("%d", &_a[_a_i]) != 1) Handle_Error_or_EOF(). 

エラー処理によっては、最良のあなたのグループのコーディングあたりのコードに、スタイルの例では

int x; 
if (scanf("%d", &x) != 1) Handle_Error_or_EOF(). 
else _a[_a_i] = x; 

に前の値を破壊する前に、まずデータを取得するには良いかもしれ標準。

2

特定の場合においてノート、タイプのみ表現「アレイ」、「アレイの最初の要素へのポインタ」に変換することになります。これは個々の配列要素には当てはまりませんので、個々の配列メンバーに値をスキャンする際には、addressof演算子を明示的に使用する必要があります。あなたは安全性を確保するためにscanf()の戻り値をチェックしたことがないようスニペットについては、言っ

は、

  • の両方がエラーを起こしやすいです。
  • アンダースコアで始まるすべての識別子は予約されているはずです。不必要に使用しないでください。

    引用C11、章§7.1.3、予約済みの識別子

    • アンダースコアと大文字のいずれか、または別 アンダースコアで始まるすべての識別子は常に使用するために予約されています。

C11を引用、章§6.3.2.1、それのオペランドである場合除い(強調鉱山

sizeof演算子、_Alignofオペレータ、または 単項&オペレータ、またはアレイ、 タイプ「」型の配列「」タイプと表現に変換される「を有する発現を初期化するために使用されるリテラル文字列である」ポインタはタイプ」 'は、 が配列オブジェクトの最初の要素を指し、左辺値ではありません。 [...]