2017-02-12 6 views
-1
char c; 
scanf("%s",&c); 

これは間違いありませんか? stdinにEOF文字を入力するとどうなりますか?%s変換指定子を持つ文字を変換することは可能です

私はSOのようなものがあると知っていますが、私はそれを見つけることができませんか?


私はすでにあるべき正確な右のフォームを知っている:

scanf("%hhd",&c); 
+2

間違いなし!ドキュメントを読む! 'scanf("%c "、&c)' –

+0

私はGoogle https://linux.die.net/man/3/scanf –

+0

でこれを見つけました。 –

答えて

0

これは間違っています。文字列をcharに入れることはできません。これは未定義の動作であり、おそらくメモリストンプが発生します。

scanf("%c", &c); 

あなたはscanfからcharを取る置く方法です。

いっそのこと、scanf()を完全に回避しgetchar()を使用します。

int c = getchar(); 

ちょうど戻り値の型を意識します。

2

いいえ、これは正しくありません。

それがchar(&c)にアドレスを送ることが同等になるように見えるかもしれませんが、それは同じではありません「文字列」。

もちろん、Cには文字列型はありません。その代わりに、文字列の終わりにヌルバイト(ヌルターミネーター)を持つバイトセットに対する文字ポインターの規則を使用する、標準ライブラリー文字列とprintfスタイル関数の抽象化が見つかりました。

scanf"%s"を読み込み、char &を指定すると、割り当ては1バイトのみになります。入力が1バイトだけであっても、それはヌルで終了します(最後に余分なバイトが追加されます)。自動的にバッファオーバーフローが発生します。

+0

EOFであっても割り当てはありません。 – Sabrina

+0

私は、ローカル変数 'c'のスタックに割り当てられた1バイトを参照していました。私は何かを割り当てる 'scanf'について話しているわけではありません。 –

0

それはchar c;scanf("%s",&c).を使用することが明らかに間違っているのです。書式指定子"%s"は、空白以外の文字列を読み込み、末尾に'\0'を追加します(cppreference concerning scanf参照)。だから、おそらく単一の文字char cによって提供されるメモリを超える可能性があります(ユーザーがreturnまたはctrl-dを押すだけでない限り)。

ではなくchar c;scanf("%c",&c).を使用してください。

関連する問題