作ってわかる
Cプログラミング
正誤情報
(2005年5月10日 更新)
■第2章
p21 2.2.3 関数を呼び出す
2.2.4の見出しの直前。
「“printf("hello, world\n")”という部分だけである」
→
「“printf("hello, world\n");”という部分だけである」
p22(2005年5月10日)
疑似コードの中身、2箇所。
「while(標準出力から1文字取って〜」
→
「while(標準入力から1文字取って〜」
p34 2.5.3 #include
この小節の6行目。「そのための宣言はまとめてstdio.hとい名前のヘッダーファイル」…→「という名前の」
p54 2.10.3 for文
「1.繰り返しの前に1回だけ実行する文(初期化)」→式
「3.毎回の末尾に1回ずつ実行する文(再初期化)」→式
p59 2.11.4 配列を使ったプログラムの例
2.11.4の1行目。「0から255までの値が」→「0から255までのコード値の文字が」。
■第3章
p70 行1
「他へ箱へコピー」→「他の箱へコピー」
p70 行3
「ポインターも変数の一種でなので」→「ポインターも変数の一種なので」
p72 3.2.4 char *argv[]とは
char *argv[]; →char *argv[]
(末尾のセミコロンが余分)
■第4章
p109 test4.c
誤
swap2(int *p, int *q)
{
int *r;
r = p;
p = q;
q = r;
}
正
swap2(int *p, int *q)
{
int r;
r = *p;
*p = *q;
*q = r;
}
p120 章末問題1
「大文字を小文字に」だけでなく、「小文字を大文字に」する機能も付けよ。
↓
「小文字を大文字に」だけでなく、「大文字を小文字に」する機能も付けよ。
■第5章
p140〜150 5.4 オプションで行数を指定する
「行数」→「桁数」
節見出しのため、右ページ上の柱部分も同様にご訂正ください。
ソースコード
ce2.c〜ce4.cで利用している関数remove_pos_blank(char *) において、元のコードでは、
「空白もしくはタブの連続のみからなる行」において、次の部分でポインターqがbuf[0]より前を指してしまうという問題があります。
while (ISBLANK(*q))
--q;
これを回避するためにコードを修正しました。配布しているソースコード=アーカイブにてご確認ください。
また、ce3.cとce4.cでは、center()関数の次の1行が間違っていました。
n = strlen(buf) + 1;
ここは「- 1」です。また、次の1行を追加する必用があります。
off = (w - n + 1) / 2;
n += 2; /* +2 for '\n'+'\0' */ ←これを追加
■第6章
p164 find1.c
ソースコード中のvoid usage(void)にて。「Usage: file1 keyword…」 →「Usage: find1 keyword…」 。
p171 find2.c 第14行
「if (argc < 0)」→「if (argc <= 0)」
■第7章
p186 配列のプログラムコード
a0〜a6に対応するコードのため、int a[6]ではなくa[7]が正しい。
- int a[6]; → int a[7];
- i < 6; → i < 7;
- 6個ではなくて → 7個ではなくて
p187 リストの最後
prinft→printf
p187 7.2.2 マトリックス(matrix)
中央の1行コード。「x[4][5] 」→「a[4][5]」。
p191 キューのリストのbuf_out()関数
2つめの関数buf_out()のreturn文の前に
--count;
が抜けていました。
p192 ツリーの説明コード
第18行「add_node(rson, new);」→「add_node(node->rson, new);」
第24行「add_node(lson, new);」→「add_node(node->lson, new);」
p204 1・2行目
末尾にセミコロンが必要。
p204 10行目
typedef SIZE int;
typedef BYTE char;
それぞれ、次が正しい記述です。
typedef int SIZE;
typedef char BYTE;
p210 7.5.2 ヒープ
ここではヒープを知るために、いくつかの動作をさせるプログラムを掲示しています。その中でヒープを整列させているのですが、記述がヒープソート(という名前のアルゴリズム)の話題だと誤解されたケースがありました。
それを避けるため、次のように訂正いたします。
- p211の箇条書きの「4. ヒープをソーティングする」→「4. ヒープを再構築(再整列)する」
- heap.cおよびmain.cのsort_heap関数→make_heap
- heap.c中の「sort_heap(--n_item); /* treeの再整列 */」→「heap(1, --n_item); /* treeの再整列 */」
■第8章
p222 脚注2
「どのアリゴリズムであっても」→「どのアルゴリズムであっても」
p229 8.3.1 逆の順序で並べたいこともある
最初の出力例ですが、「昇順」といいつつ昇順になっていません。次の順序が正しい昇順です。
Agneau
Boeuf
Mouton
Porc
Veau
sort1.c〜sort4
エラーメッセージ「too much lines」→「too many lines」
また、sort2.cとsort3.cに関して、複数ファイルへの対応に不具合がありました。訂正後のソースを配布アーカイブから入手してください。
p228 箇条書きの3つ目
read_line()→write_line()
p236 ページ最上段
const double pi = 3.14
と宣言された整数型の変数piは、......
浮動小数点数型の間違いです。
p273 Makefile
ソース中のMakefile.0も同様です。
誤
sort4.o: sort4.c sort.h
cc -c sort4
comp4.o: comp4.c sort.h
cc -c comp4
正
sort4.o: sort4.c sort.h
cc -c sort4.c
comp4.o: comp4.c sort.h
cc -c comp4.c
■第9章
p282 冒頭のコード
pi = 3.14159 /* 実際にはpiには"3"が入る */
pi = 3.14159; /* 実際にはpiには"3"が入る */
p289、p290、p300 page2.c:page3.c
P289 下から12行目
fprintf(stderr, "--more--", stderr);
P290 上から7行目
fprintf(stderr, "--Hit Return Key--", stderr);
P300 最終行
fprintf(stderr, "--Hit Return Key--", stderr);
どちらも末尾のstderrは不要です。
誌面では大丈夫ですが、ソース中のpage1.cにも同様のエラーがありました。
p297、p302 #include "line.h"
「#include "list.h"」の間違いです。
p303 list.h
list.hの2行目のline.h→list.h
内容は、記載されたもので合っています。
■第10章
p320 10.4 テキスト編集
一連のプログラムで使用されるヘッダーファイル"line.h"が、本文には掲載されていません。配布しているアーカイブには含まれているので、そちらをご確認ください。
まだ、edit.cのedit()関数ですが、iコマンドの動作での不具合を避けるために、次のように変更します。全文は配布アーカイブにてご確認ください。
- 「case `i`」直後に追加「tmp = cur;」
- 「cur = ins_line(cur, buf);」を「tmp = ins_line(cur, buf);」に変更
- whileループの直後に追加「cur = tmp;」
p329 Windows用のmakefile
ソース中のMakefile.2も同様です。
誤
line.obj: line.c line.h
cl -W4 -c line.c
strdup.o: strdup.c
cl -W4 -c strdup.c
正
line.obj: line.c line.h
cl -W4 -c line.c
strdup.obj: strdup.c
cl -W4 -c strdup.c
■第11章
p337
問題(ヌ)の解説が、当方のミスでそっくり抜け落ちておりました。お詫び申し上げます。
(ヌ)は、「*++ 」というように「* 」と「++ 」が連続している部分が目を引くかもしれない。
この表記を見慣れていないと、何となくそのへんに誤りがあるのではないかと気をとら
れるかもしれないが、実はこれもけっこうありがちなコードだ。
x*(++j) と同じ意味である。
では誤りはどこにあるかというと、何のことはない。
if文の条件部分で「== 」のつもりで「= 」と書いてしまっていた、というオチである。
if文の条件部分に代入式を書いても文法的には何も誤りではないが、
代入式の右辺が定数だったら「何かのマチガイ」だと思ってもさしつかえないだろう。
こんな簡単な誤りも、近くに気をとられる箇所があるとけっこう見逃してしまいがちだ、という例である。
p356 11.3.6 sed
下4行の中に3箇所ある[ \t]のうち、上2つは[^ \t]です。
■第12章
p372 7行目
「ここまでで、shor、long」…→short
p374 12.2.4 enum 12行目
「enum dir = {EAST,WEST,SOUTH,NORTH};」→「enum {EAST,WEST,SOUTH,NORTH} dir;」
p377 中ほど
記載:
int i;
while (s[i] != '\0') {
訂正:
int i;
i = 0;
while (s[i] != '\0') {
p380 12.3.3 代入式も値を持つ
if ((r = malloc(len) == NULL)
正しくは次のとおり。
if ((r = malloc(len)) == NULL)
p381 12.3.4 文字列リテラルに添字
コード引用の2つ目。
char s[16] = "0123456789abcdef"
a = s[i];
この1行目に文末セミコロンが抜けていました。
p386 12.5.1 scanf() 10行目
「初心者ユーザーが直感的にわかりにくいというだけでなく」→「初心者ユーザーが直観的にわかりにくいというだけでなく」。
p388 注8
Braian W.Kernighan → Brian W.Kernighan
■付録A
p399 A.3.1 日本語文字のエンコード
誤植ではなく、注意の追加です。
Windows環境の一般のテキストエディターを使って編集してもかまわない。
ただし、改行コードの違いには気をつけなければいけない。
cygwin側で改行コードを変換しないように設定しているならば、
作成するテキストファイルはUnix形式の改行コード(\n だけ)になるように
エディターを設定しておこう。
■付録B
p408 B.1 演算子の結合と優先順位
表1行目:{} →[]
表14行目:!= →|=
p410 B.3 文字定数
附註の2つ目。「16進数2桁以内で。」→「16進数で。」
p414 B.6 printfの変換指定子
最初の表の最後の行
「% 」で%そのものを表示する → 「%% 」(%を2つ重ねる)。
■索引
p419 D
default の参照先 368→370
*p421 s*
scanf() の参照先 387→386
*p421 い*
「1の補数演算子」の参照先 385→384
■内容以外の微調整
p.v 目次
第10章〜第12章のあとにスペースの余裕がない。
p8 1.2.2 出力先の変更(リダイレクション)
hello
で起動することになっているが、これはp4で説明したWindowsの方式
のもの。「Unixでそのように起動するにはp391を参照....」などの脚註が必要かもしれない。
p21 2.2.4の直前
'; '(セミコロン) に余分なスペースがある。
p26〜の箱イラスト
「ハコ」が「11コ」と誤読しやすい。
p202
「構造体メンバー演算子」「間接演算子」をそれぞれ索引項目に。
(p72で出てきたまま、しばらくでてないので、ここでもう一度用語の英語名も出したたほうがいい。むしろp72のほうでp202を参照させる。)
→戻る
−注意−
このWWWページで使用されている画像・文章およびデータは、すべて著作権法上の保護を受けています。
|