• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:%sの使い方について教えてください。)

%sの使い方について

このQ&Aのポイント
  • %sの使い方について教えてください。
  • この関数は%sでcのアドレス(&c[0])を読み込み、stdoutにそのアドレスを書込み、文字列abcが表示されると認識しています。
  • printf("%s",*stdin)としなければ出力されません。また、printf("%d",sizeof *stdin)と入力すると、32と出力されます。stdinは32バイトの大きさだと認識したのですが、char型の文字が32文字以上を書き込むことができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.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が呼ばれたらバッファ内容を書きますが)

gokugokuR
質問者

お礼

返信遅くなりました。 printfの書式制御文字列の引数は基本的に変数で、配列の場合だけはアドレスを入力しても認識できるということですね。 FILE構造体のことを調べました。構造体の大きさが32バイトでバッファの大きさは4kBでした。 親切にどうもありがとうございました。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

stdinは標準入力を表すFILE構造体への参照です。 なので、まずはヘッダーファイルなどをみて、FILE構造体がどのように定義されているか確認してみては。

参考URL:
http://www.google.co.jp/search?hl=ja&q=FILE%E6%A7%8B%E9%80%A0%E4%BD%93+stdin&lr=lang_ja
gokugokuR
質問者

お礼

返信遅くなりました。 そうですね。まずはそこから勉強ですね。stdinを配列と同じように認識していました。FILE構造体はstruct構造体で構造体の型が32バイトでした。バッファサイズは4096バイト(=4kB)ありました。 ありがとうございました。

関連するQ&A