3

をコンパイルするscanf("%s", &var);と、gcc から警告が返されます。

warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[20]’

ただし、コンパイルするscanf("%s", var);と、警告は適用されません。コードの両方の部分と私が読んでいる本では、アンパサンドを使用するように具体的に述べられていますが、一部の例ではそうではありません。

私の質問は、本で指定されていない場合でも、アンパサンドを使用し続ける必要があるかということです。

4

4 に答える 4

4

あなたが投稿しvarたものはchar配列です。その場合、アンパサンドは必要ありません。必要に応じて、名前だけがvar(char *) に評価されます。

詳細:

scanf には、入力を格納する変数へのポインターが必要です。文字列の場合、読み込まれた文字列を格納するのに十分な大きさのメモリ内の文字配列へのポインターが必要char var[100]ですchar。 var[99] は 100 番目の文字を参照します。&var[0]配列名自体は、scanf が必要とするシーケンスの最初の文字へのポインタである とまったく同じものに評価されます。したがって、必要なことは だけですがscanf("%s", var);、 は入力文字列にサイズ制限を適用しないことに注意してscanfください。したがって、ユーザーが長さ 101 の文字列を入力すると、バッファ オーバーランが発生し、バグが発生したり、さらに悪いことにセキュリティの問題が発生したりします。より良い選択は、一般的にfgetsこれにより、入力文字列のサイズ制限が許可されます。

于 2010-03-13T19:38:10.973 に答える
1

&から を取り外しますscanf("%s", &var);ので、 ですscanf("%s", var);

于 2011-01-27T18:42:38.180 に答える
0

このような配列を使用する場合:

char name[20];

20 文字で構成されるメモリ領域が関連付けられていることを考慮する必要があります。そのメモリ領域の先頭のアドレスを取得するには、配列の名前を使用する必要がありますが、その配列の単一の文字のアドレスを取得するには、次のようなシンタックスを使用する必要があります: &name[i].
scanf を使用して、C の char の配列である文字列を読み取ります。scanf には、読み取る変数の型に関連付けられたメモリ領域のアドレスが必要です。この場合、配列を読み取っているので、名前のみを使用する必要があります。配列ではなく単一の変数を読み取りたい場合は、アンパサンドを使用する必要があります。例えば:

char myChar;
scanf("%c", &myChar);

これがお役に立てば幸いです。

于 2010-03-13T20:00:25.017 に答える