2016-06-20 20 views
1

文字列をスキャンし、このスキャン文字列のポインタをcharとしたいとします。scanf charポインタの文字列

int main(int argc, char *argv[]) { 

    char *string; 
    scanf("%s",&string); 
    printf("%s\n",string); 

} 

しかし

警告言って警告できます:フォーマット '%s' は型 'のchar *' の引数を期待していますが、引数2 が

'文字**' を入力しているが

char *の文字列を警告なしでスキャンするにはどうすればよいですか。

編集:以下のコードでは警告が表示されていましたが、私はそれを上のコードに掘り下げて非常に具体的にしました。

int main(int argc, char *argv[]) { 

    int n = 2; 

    char *strings[2]; 
    for(int i = 0; i < n; i++){ 
     scanf("%s",&strings[i]); 
     printf("%s\n",&strings[i]); 
    } 

} 

enter image description here

+1

文字列変数のメモリを割り当ててから、 '&string'の代わりに' string'だけを渡します。 – Jeyaram

+0

言い換えれば、メモリバッファの割り当て方法をまだ分かっていないときに、コンパイラのエラーを消す方法を尋ねています。 –

+0

...固定長の文字列を使用するか、それはあなたが読んで計画しているものによって異なります。 – Kusalananda

答えて

5

まず、scanf()%scharからポインタないcharへのポインタをポインタを受け取ります。

C11を引用し、章§7.21.6.2/ P12、fscanf()強調鉱山

s
は、非空白文字のシーケンスに一致します。 286)

ないl長修飾子が存在しない場合、対応する引数は、文字列の最初の要素へ ポインタでなければならない追加され 配列とヌル文字を受け入れるのに十分な大き自動的に。 [...]

変更

scanf("%s",&string); 

あなたが実際にそれにスキャンにしようとする前に、あなたがstringにメモリを割り当てる必要があり、言わ

scanf("%s",string); 

へ。さもなければ、あなたはundefined behaviorを呼び出す初期化されていないポインタを使用して終了します。