- ベストアンサー
%sの使い方について
- %sの使い方について教えてください。
- この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。
- printf("%s",*stdin)としなければ出力されません。また、printf("%d",sizeof *stdin)と入力すると、32と出力されます。stdinは32バイトの大きさだと認識したのですが、char型の文字が32文字以上を書き込むことができます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。 間違っています。printf("%s",c) は、%s から c が文字の配列へのポインタだと解釈して、そのポインタアドレスから、'\0' が格納されているアドレスまでの範囲の文字をstdoutにputcします。 プログラム内で、「stdinとは何か」「stdout」とは何かが理解できていないようです。 文字を格納するエリアではありませんよ。FILE型変数へのポインタです。 FILE型は、 typedef struct ... { ..... } FILE; と定義されたstruct構造体で、ファイルにアクセスするための情報やバッファの情報が入っています。 上に書いた「stdoutに文字をputcする」というのは、stdout構造体の中にバッファへのポインタや、バッファサイズ、バッファ中の「次の位置」を示すポインタがあるので、バッファ中の次の位置に書き込み、ポインタをインクリメントして置きます。このときもしバッファがいっぱいになれば、バッファ内容をファイルに書き込んで、バッファを空にします。 (バッファがいっぱいにならなくても、fflushとかfcloseが呼ばれたらバッファ内容を書きますが)
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
stdinは標準入力を表すFILE構造体への参照です。 なので、まずはヘッダーファイルなどをみて、FILE構造体がどのように定義されているか確認してみては。
お礼
返信遅くなりました。 そうですね。まずはそこから勉強ですね。stdinを配列と同じように認識していました。FILE構造体はstruct構造体で構造体の型が32バイトでした。バッファサイズは4096バイト(=4kB)ありました。 ありがとうございました。
お礼
返信遅くなりました。 printfの書式制御文字列の引数は基本的に変数で、配列の場合だけはアドレスを入力しても認識できるということですね。 FILE構造体のことを調べました。構造体の大きさが32バイトでバッファの大きさは4kBでした。 親切にどうもありがとうございました。