プログラミング言語C-入出力
津路です。
プログラミング言語C 第2版 ANSI規格準拠 K&R著(共立出版)を読んで、気になるところを書いています。
自分で、再勉強をしたいと思って、できるだけ細かく読んでいます。
7.3 書式付き出力-printf
ページ188に、以下の文章があります。
「以下に、”hello, world(12字)を印字するときのさまざまな仕様の効果を示す。」
この後、指定子とその結果をリストアップしているので、ここの「仕様」は、「指定子」の意味でしょう。
演習7-2
「任意の入力を意味のある形に印字するプログラムを書け。最低でも非印字文字をローカルな習慣によって8進か16進で出力し、長いテキスト行は折り返して出力するようにせよ。」
「非印字文字を出力」どうやって出力するのでしょうか?原文を見ると、「As a minimum, it should print non-graphic characters」とありますので、通常文字として印字できない、改行などの特殊記号を指すようです。これを、8進または16進数値の形で印字するのが意図のようです。
「ローカルな習慣」とは、「according to local custom」とありますので、それぞれの慣用形式(どちらか)でといった意味なのでしょう。
7.4 書式付き入力 – Scanf
書籍「関数 scanf は printf の入力版であり、同じ変換機能の多くを逆に使っている。」
逆に使っているのでなく、逆方向に実現しているのでしょう。標準入力から読み込んで、指定子の後ろの引数へ結果を格納するのですから。
書籍「制御引数については下に示すが、その他の引数は、それに対応する変換入力を格納できるようにどれもポインタでなければならない。」
ちょっと理解には時間がかかります。
「書式引数は後で述べるが、その他の引数は、どれもポインタでなければならない。なぜなら、対応する変換結果を格納する場所を指すからである。」ではいかがでしょうか?
書籍「ファイルの終わりではEOFが返る。これは0とは違うことに注意されたい。0は入力文字が書式文字列の最初の仕様と一致しないことを意味する。」
EOFは、0とは別ものです。最後の文は、この0ではなく、EOFを指すはずです。「EOF は、次の入力文字が最初の変換指定子と一致しないことを意味する。」でしょう。
書籍「書式文字列は通常、変換仕様を含んでおり、それは入力の変換を制御するのにつかわれる。書式文字列には次のようなものが含まれる。
・ブランクあるいはタブ。これらは無視される。
・通常文字(%以外)。入力ストリーム中で次に来る空白文字以外の文字に適合するはずの文字。
・変換仕様。文字%, 代入禁止文字*(省略可能), フィールドの最大幅を指定する数字列(省略可能), ターゲットの幅を示すh, lあるいはL(省略可能), 変換文字を含む。
」
項目2の通常文字の文章が変です。単語「文字」が3回出てきます。原文は以下です。
• Ordinary characters (not %), which are expected to match the next non-white space character of the input stream.
複数形です。「入力ストリームの、次の空白でない文字に一致することが期待される」ではいかがでしょうか?
項目3の変換仕様の文章も変です。説明が具体的に何を指すのかちょっと。
候補「変換指定文字列。以下の要素からなる。文字%, 代入禁止文字*(省略可), フィールドの最大幅を指定する数字(省略可), ターゲットの幅を示すh, lあるいはL(省略可能), 変換指定子。」
フィールドの最大幅とは、変換結果の幅、つまり桁数です。h,l,Lは、長さ修飾子で、入力変数をどう解釈するかを意味し、%ldであれば、倍精度整数を10進数として入力するという意味です。