小山清一「はじめてのCプログラミング」西東社, (ISBN4-7916-0819-4)の正誤表です。
どうも,この著者は「数字」と「数値」の区別ができていない。
配列,構造体の説明のためとはいえ,本来の使用法というか実際に配列や構造体を使うとどのようなことが便利にできるかという例を提示していない。
細かい点に漏れがある。場合によっては,実際に読者がプログラムを始めると,ドツボにはまるような種をまいている感さえある。
P.14 ↑4 誤:PL/1 正:PL/I P.22 ↑11-8 誤:バックアップディスクの枚数がオリジナルディスクの枚数より 多くなる 正:DISKCOPY コマンドによるバックアップでは枚数は同じ P.25 プログラム例 ANSI 準拠の C プログラムは,main は int でなくてはならない。 従って,値を返す return 文が必要になる。 int main(void) { : return EXIT_SUCCESS; } P.28 ↑1 stdio.h にあるのは,printf のプロトタイプである。 P.43 ↑2 \? は ? で代表される任意の1文字を表示するためのもので, 疑問符 ? を表示するために必要なものではない。 P.55 ↓14 誤:変数のつけ方 正:変数名のつけ方 P.57 ↓5 a='u'; という表現は正しい。 a=1000; は,整数を代入しているから間違いなのではなく,扱える 範囲を超えた数値を代入しているから間違いなのである (文法的には正しい)。 P.57 ↓11 誤:数字 正:数値 P.57 ↓16 誤:A 正:'A' P.76 最初のプログラム このプログラムは不正なプログラムである。動くはずがない。 また,scanf は使わせるべきではない。 P.80 ↑6,P.81 ↓11,↑7,↑6 誤:%lf 正:%f printf で,double を表示するためには %f を使う。scanf と printf は対称ではない。 P.97 ↓7 swich () { 以降最初の case までに実行文があってはならない。 P.102 ↓1〜2 < > <= >= は文字形の場合にも使える。 小さな整数として比較される。 P.102 ↑2 誤:b = 1 || b = 3 正:b == 1 || b == 3 P.107 ↓9 誤:入力した数字が 正:入力した数値が P.118 ↑9 誤:(繰り返し条件を満たす)まで 正:(繰り返し条件を満たす)間 P.130 ↓4 誤:for 文の条件評価の箇所に処理が移っていきます。 正:for 文の条件再定義の箇所に処理が移っていきます。 P.130 絶対値を求めるプログラム return で返す値の式は ( ) で囲まない方がよい。 P.137 ↑3 for (a = 'A'; a <= 'Z'; a++) のほうが「モアベター」 P.140 奇数を表示するプログラム #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdio.h> int main(void) { int a = 1; do { printf("%d ", a); a += 2; } while (a <= 49); return EXIT_SUCCESS; } P.141 ↑8 誤:条件判定に戻るように 正:条件再設定に進むように P.142 プログラム #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdio.h> int main(void) { int a; for (a = 1000; (a % 15) != 0; a--) /* 15 の倍数があることは確かなので */ ; /* セミコロンが必須 */ prntf("求める数値は %d です。\n", a); return EXIT_SUCCESS; } P.145 ↓12 誤:要素が1つなので 正:添字が1つなので P.157 ↑11 誤:要素が2つある場合の配列を 正:添字が2つある場合の配列を P.157 ↑10 誤:要素が1つ 正:添字が1つ P.164 ↑4 誤:sizeof hairetu / hairetu[0] 正:sizeof hairetu / sizeof hairetu[0] P.191 ↓2 誤:この場合は「"C:\AUTOEXEC.BAT"」「C:AUTOEXEC.BAT」と 正:この場合は「"C:\\AUTOEXEC.BAT"」と 注:" " の中では \A は A そのものを表すことに注意 "C:\AUTOEXEC.BAT" は C:AUTOEXEC.BAT というファイルを表し, これは C:\AUTOEXEC.BAT とは異なることがある。 もう少しまともな例を書くと c:\root\sub\file.dat という ファイルを開くときには, fp = fopen("a:\\root\\sub\\file.dat", "r"); と書かねばならないということである。 P.191 ↑4 誤:こうすると,ファイルの終わりに「EOF」が付けられるのです。 正:削除(EOF などは自動的には付かない。付ける必要もない)。 P.194 ↓7 誤:main へ戻る 正:main を呼び出した制御プログラムへ戻る P.199 ↓1,3,4,5,7,8,9 誤:fp-1,fp-2,fp-3 正:fp_1,fp_2,fp_3 注:(名前の構成要素に - (マイナス)は含まれない) P.200 ↓2 誤:「&」は int 型の場合につけるようにします。 正:正確に表現するとかえってややこしくなるのでパス P.202 ↓11 誤:ではファイルポインタ fp の中身が「OKUYAMA REPORT」である 場合の印刷をしてみましょう。 正:では,ファイルポインタ fp が stdprn のとき, 「OKUYAMA REPORT」と印刷してみましょう。 P.222 ↓12-13 誤:scanf の引数は a,戻り値は入力の終わりを示す「EOF」 (End of File -1)です。printf の場合は引数が a, 戻り値が 2 です。 正:scanf の引数は a,戻り値は正しく入力された数値の個数 (この場合は1)です。printf の場合は引数が a, 戻り値は出力されたバイト数(この場合は 26)です。 P.222 ↓15 誤:main 関数は正式には,「void main()」とか「main(void)」... 正:void main() というのは ANSI 規格に違反している。 後者は省略時の解釈で「int を返す,引数を持たない関数」 という意味である。 P.223 ビット演算子の二つ目の欄にある演算子 ~ である。フォントによっては波線でなく直線のように 表示されることがあるが,その場合も - (マイナス)ではなく, 上の方に書かれる。 P.224 プログラム #include <stdio.h> void tuduki(void); int main(void) { printf("巷に雨の降るごとく"); tuduki(); return EXIT_SUCSESS; } void tuduki(void) { printf("わが心には涙降る"); } P.231 ↓1,16 誤:\? 正:? P.235 ↓5,↑4 誤:char a; 正:int a; P.236 ↑6 誤:表示します。 正:変数に代入します。 P.236 ↑3 誤:文字型配列を入れた結果,ヌル文字(\0)を戻り値として 返します。 正:文字形配列を入れた結果,文字列の先頭アドレスを戻り値と して返します。ファイルエンドまたはエラーのときは NULL を返します。 P.237 ↑10 誤:もっとも,実際のプログラムでは CTRL+Z キーを押すと ヌル文字を返すことから, 正:CTRL+Z を押すとファイルの終了を表すので戻り値として NULL が返されるので, 注:ヌル文字(\0)と NULL は異なる P.239 ↑2 誤:文字列の最後を示す記号定数で 正:ポインタが何も指していないことを表すために使われる記号定数で 注:ヌル文字(\0)と NULL は異なる P.241 ↓15 誤:なお,strcpy 関数でコピーするさいの変換文字は「%s」であることに 正:なお,printf 関数でプリントするさいの変換文字は「%s」であることに P.242 ↑3 誤:a<A A は a より大きい 正:a>A a は A より大きい P.248 ↓9,↑5,P.249 ↑11 誤:c:\moji.txt 正:c:\\moji.txt P.249 ↑4 およびプログラム 誤:ここで問題なのは「EOF」を書き込む場合です。「0x1a」は 「EOF」を表すものと覚えておきましょう。 正:「EOF」はファイルに書き込むべきものではない。 P.250 ↓8 誤:c:\moji2.txt 正:c:\\moji2.txt P.251 下のプログラムの6,7行目 誤:char *b; b=" "; 正:char b[9]; P.251 ↓7,↑8 誤:c:\moji3.txt 正:c:\\moji3.txt P.252 ↓11,↑3 誤:c:\moji4.txt 正:c:\\moji4.txt P.254 ↓8,↑8,P.255 ↑2 誤:c:\syouhin.dat 正:c:\\syouhin.dat P.257 ↑12 誤:log(x) 自然対数 ex を求める 正:log(x) 自然対数 ログ(log) を求める P.258 ↑4,P.259 ↑7,P.260 ↓9,P.261 ↓5,P.261 ↑4,P.262 ↓12 誤:%lf 正:%f P.267 ↑1 誤:char *a=" "; 正:char a[10]; などで十分。a がポインタである必要はさらさらない。 P.305 ↓13 誤:プリプロセッサと呼ばれ 正:プリプロセッサ・ダイレクティブと呼ばれ P.305 ↑6 誤:このサブにあたるのが printf などの関数といえます。 正:このサブにあたるのはユーザが定義した関数であるといえます。 P.308 ↑3 誤:\? ? を表示する 使い方も不適切 正:\? 任意の1文字(?)をそのまま表示する。