作ってわかるCプログラミング
技術評論社

作ってわかる
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ページで使用されている画像・文章およびデータは、すべて著作権法上の保護を受けています。