C言語の素晴らしさを伝えたい!
本書は、C言語の美しさ、優れた機能性、時代を超えて通用する普遍性、そして知的興味を満たす面白さを皆さんに伝えたい、という筆者の情熱から企画されました。
決まった解説メニューをこなすだけで、難しい点はごまかす安易な入門書ではありません。本書の続編を含めて読み通すことで、C言語の全貌がわかり、テクニックを駆使したベテランの書いたソースコードも読みこなせるようになることを目標とします。
そして、安易な自己流の解釈や、特定製品だけで通用する常識は排し、定義や用語などは国際標準であるISO/IEC 9899:1999 Programming languages -- C(通称C99)およびその日本版であるJIS X 3010:2003 プログラム言語-Cを前提として、全世界に通用する本物のC言語を解説します。それだけでは足りない部分に関しては、特定製品依存の機能をそれと断って活用することもためらいません。
また、多くのベテランCプログラマから要望の多い「コマンドラインでコンパイルする」「1つのコンパイラだけを体験するので終わってしまわない」という点にも重点的に配慮しました。本書はコマンドライン操作を前提とし、Visual C++のCコンパイラと、MinGWのgccという2つのCコンパイラの双方で実習を進める形式を採ります。
一方で読者の負担も配慮し、一般的なWindowsパソコン(XP以降)が1台あればすべての実習が可能となるように配慮しています。
さあ。C言語に興味はあるが勉強はつらそうだと思っているあなたや、他の入門書で納得しきれなかったあなた。今こそ、本書で魅惑のC言語の世界に飛び立ちましょう。
本書は、日経ソフトウエア2005年7月号より連載された「基本はいつもC言語」および2006年7月号より連載された「実用Cプログラミング・テクニック」の2つの連載と、他の一部の記事原稿を再構成したものです。内容を全面的に見直し、大幅な加筆修正も行っています。また、雑誌掲載時に誌面の都合でカットされたコラムなども大幅に復活していますので、連載をお読みになった方もご注目ください。本書が真の完全版です。
以下は校正版ベースなのでページ数等に相違があるかもしれません。
C はあなたに何を与えるか 1 なぜC を学ぶのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2 プログラミング言語とは何か ・・・・・・・・・・・・・・・・・・・・・・・・・ 2 C を学ぶもう1 つの理由 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 4 なぜ教科書を用いるのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5 コラム プログラムとソフトウェア ・・・・・・・・・・・・・・・・・・・・・・ 6 コラム チャレンジ問題と採点プログラム ・・・・・・・・・・・・・・・ 6
シンプルかつ強力な操作体系 9 文字による操作に取り組もう ・・・・・・・・・・・・・・・・・・・・・・・・ 10 コマンドプロンプトを操作する ・・・・・・・・・・・・・・・・・・・・・・ 11 拡張子の役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13 コラム テキストエディタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15 コマンドライン ヒストリの活用 ・・・・・・・・・・・・・・・・・・・・・ 15 基本的なコマンド ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 16 ワイルドカード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 19 処理を自動化するバッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 20 実行するコマンドの指定方法 ・・・・・・・・・・・・・・・・・・・・・・・・ 21 コラム Windows 以外で使用するコマンド ・・・・・・・・・・・・ 22
最も簡単なプログラム 23 ハローワールドを書く ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24 コンパイラの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24 C 言語に関するファイルの役割 ・・・・・・・・・・・・・・・・・・・・・・ 25
Visual C++ の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 30 統合開発環境を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 31 ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 33 プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 36 コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38 ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38 コンパイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 40 プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 41
gcc の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44 MinGW の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44 コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 45 実行ファイル名を指定する ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 46 ソースファイルに日本語文字を書き込む ・・・・・・・・・・・ 47 コラム エラーの起こる文字一覧プログラム ・・・・・・・・・・・ 50 コラム cp932 の指定が有効にならないケース ・・・・・・・・ 50
ファイルにも画面にも出力 53 ハローワールドプログラムをとことん楽しむ・・・・・・ 54 わずかな労力で多くの機能を ・・・・・・・・・・・・・・・・・・・・・・・・ 57 最初に実行される関数main ・・・・・・・・・・・・・・・・・・・・・・・・・・ 60 ライブラリという機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 60 ライブラリ活用のためのヘッダファイル ・・・・・・・・・・・ 62
キーボードやファイルから入力 65 「決まり切った文字列」を卒業しよう ・・・・・・・・・・・・・・・・ 66 標準入力のチカラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 68 プログラムの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 69 コラム バッファオーバーランの危険 ・・・・・・・・・・・・・・・・・・・ 71 コラム _mbsupr 関数を使わずに記述する ・・・・・・・・・・・・ 72
プログラムに賢さを与える 73 知恵のタネとなる条件判断 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74 もしも入力が空だったら? ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74 ソースコードの説明 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 76 コラム どこにも送られない特殊なファイル名 ・・・・・・・・・ 68 金額によって処理を分ける ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 79 コラム 整数とは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 82 コラム さまざまな条件 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84 コラム return 文 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84 合い言葉は「山」「川」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84 コラム その他の条件判断機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 89 コラム 文字列の比較に== を使用できない理由 ・・・・・・ 89
プログラムに力を与える 91 プログラムの「力」は繰り返しにあり ・・・・・・・・・・・・・・・・ 92 羊を数える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 93 回数を指定した繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 98 2 重の繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 103 コラム 繰り返しに使う変数名 ・・・・・・・・・・・・・・・・・・・・・・・・ 104 Upper1 を任意の行数に拡張する ・・・・・・・・・・・・・・・・・ 107 コラム コントロールキーの活用 ・・・・・・・・・・・・・・・・・・・・・・ 112 コラム 繰り返しはパターンを決めよう ・・・・・・・・・・・・・・ 112 コラム 決まらない回数の繰り返し ・・・・・・・・・・・・・・・・・・・ 113
文字イコール数値という不思議 115 多数のデータを効率よく記憶する配列 ・・・・・・・・・・・ 116 複数の番号について集計する ・・・・・・・・・・・・・・・・・・・・・・ 117 配列の範囲外アクセス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 121 文字列イコール配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 123 コラム ' ¥n' と" ¥n" の違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 127 文字とは実は数字である ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 128 漢字を正しく逆転させるには ・・・・・・・・・・・・・・・・・・・・・・ 132 10 進数と16 進数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 132 1 バイト文字と2 バイト文字の区別 ・・・・・・・・・・・・・・ 135 コラム 配列の範囲外アクセスの必要性 ・・・・・・・・・・・・・・ 139 コラム setlocale 関数の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・ 140 コラム 1 バイト目と2 バイト目の英語表記 ・・・・・・・・・ 140 コラム データの入った配列を宣言する ・・・・・・・・・・・・・・ 141 コラム 文字列の入った配列を宣言する ・・・・・・・・・・・・・・ 142
最大の難敵にして最強の味方 143 さあ、いよいよポインタだ ・・・・・・・・・・・・・・・・・・・・・・・・・ 144 メモリ空間は巨大な配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 144 ポインタでメモリ空間を扱う ・・・・・・・・・・・・・・・・・・・・・・ 149 ポインタを知ればライブラリ関数を活用できる ・・・ 154 整数型のポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 158 コラム char とunsigned char ・・・・・・・・・・・・・・・・・・・・・・ 162 コラム なぜunsigned char を使うのか? ・・・・・・・・・・ 162 コラム 配列ではない変数のポインタ値を得る ・・・・・・・ 163 コラム 数値をバラバラに分解する ・・・・・・・・・・・・・・・・・・・ 164 コラム データのサイズの注意 ・・・・・・・・・・・・・・・・・・・・・・・・ 166
同じコードを繰り返し書く無駄を排除せよ 167 一括置換では直せない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168 重複を取り除こう ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 169 関数を自作する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 172 引数を使って関数自由自在 ・・・・・・・・・・・・・・・・・・・・・・・・・ 175 返却値で結果を返す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168 有効範囲(スコープ)という罠 ・・・・・・・・・・・・・・・・・・・・・・ 182 main 関数の引数と返却値を使う ・・・・・・・・・・・・・・・・・・ 186 引数の受け取り方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 189 返却値の返し方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 190
データを結集すれば力も倍増 193 データをまとめて扱う意義 ・・・・・・・・・・・・・・・・・・・・・・・・・ 194 なぜひとまとめにするか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 194 構造体を宣言する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 198 目次 iv Cgen_000_iv_ix_moku(06).indd 4-5 09.2.27 2:06:44 PM 目次 構造体を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 199 struct キーワードを書かないで済ませるには ・・・ 202 構造体で引数を簡単にできる ・・・・・・・・・・・・・・・・・・・・・・ 206 構造体の配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 209 構造体で実現するリンクリスト ・・・・・・・・・・・・・・・・・・・・ 210 コラム 入力通りに列挙する ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 216
複数のファイルを自在に操れ 219 標準入出力からの巣立ち ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 220 この2 つのファイルは同じものか? ・・・・・・・・・・・・・・ 220 ファイルを比較する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 224 ファイルのオープンとクローズ ・・・・・・・・・・・・・・・・・・・・ 226 gets 関数とfgets 関数の相違点 ・・・・・・・・・・・・・・・・・・・ 228 複数のファイルを1 つにまとめる ・・・・・・・・・・・・・・・・・ 230 複数のファイルに分割して書き込む ・・・・・・・・・・・・・・ 235 コラム fclose 関数の効能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 240 コラム FILE 構造体の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 242
検索+ソート+ユニークの自作に挑戦 243 効果的なC の学習法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244 検索、ソート、ユニーク ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244 ワイルドカード対応の検索ツール ・・・・・・・・・・・・・・・・・ 247 1 つの繰り返しを1 つの関数で ・・・・・・・・・・・・・・・・・・・・ 251 順番に並べ替えるソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 256 泡のようにソートせよ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 258 bsort のソースを読む ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 259 バブルソートを行う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 262 ユニークな結末 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 264 コラム DBCS イネーブリング ・・・・・・・・・・・・・・・・・・・・・・・・ 265 コラム true とfalse ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 266 コラム qsort 関数のアルゴリズム ・・・・・・・・・・・・・・・・・・・ 266
“本物”のプログラマに必須のテクニック 267 誤りはどうしても入り込む ・・・・・・・・・・・・・・・・・・・・・・・・・ 268 デバッグの重要性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 270 デバッガを使わないデバッグ ・・・・・・・・・・・・・・・・・・・・・・ 271 名探偵を目指せ——推理と絞り込み ・・・・・・・・・・・・・・ 271 違う角度からソースを見る ・・・・・・・・・・・・・・・・・・・・・・・・・ 273 誰もが知る有名テクニック——printf デバッグ ・・・・ 274 コラム 使い終わったprintf 関数呼び出しの処置 ・・・ 278 ファイルへのデバッグ出力 ・・・・・・・・・・・・・・・・・・・・・・・・・ 279 あるべき値を保証するassert ・・・・・・・・・・・・・・・・・・・・・・ 282 デバッグ用途に使うassert ・・・・・・・・・・・・・・・・・・・・・・・・ 284 コラム C では特に重要なデバッグ ・・・・・・・・・・・・・・・・・・・ 287 コラム 原因を絞り込めないケース ・・・・・・・・・・・・・・・・・・・ 287 コラム 自分に責任のないバグ ・・・・・・・・・・・・・・・・・・・・・・・・ 288 コラム assert マクロはエラーチェック用ではない ・・・・ 288
CSV ファイルを扱うプログラムを作ろう 289 リミッターを1 つ解除しよう ・・・・・・・・・・・・・・・・・・・・・・ 290 CSV ファイルとは何か ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 290 敵を知る——仕様書はどこだ? ・・・・・・・・・・・・・・・・・・・・ 292 CSV ファイルの詳細 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 293 コーディングを始める前の2 つの注意点 ・・・・・・・・ 295 関数の仕様を考える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 297 CSV の迷宮を踏み越えろ ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 299 readRecord 関数の内容 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 302 readRecord 関数の使い方 ・・・・・・・・・・・・・・・・・・・・・・・・・ 305 readRecord 関数の活用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 307 コラム 1 つの配列に複数の文字列を入れる ・・・・・・・・・・ 313 コラム 0 と1 の論理世界 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 314
優先順位にご用心 317 C 言語における式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348 演算子の一覧 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348 優先順位の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 320 コラム 式の評価の難しさ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 321
それはソースの自動書き換え 323 C なのにVisual Basic 風? ・・・・・・・・・・・・・・・・・・・・・・・ 324 ヘッダファイルとマクロのトリック ・・・・・・・・・・・・・・ 327 マクロの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 331 関数のように使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 334 マクロの副作用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 337 長いマクロの書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 338 マクロの性能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 341 マクロの使い過ぎは肥満の元 ・・・・・・・・・・・・・・・・・・・・・・ 344 コラム 整数と実数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 347
ソースを差し替え、コンパイル時刻を刻み込む 349 品川までは何マイル? ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 350 条件判断に使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 351 #ifdef で実現する品川からの距離 ・・・・・・・・・・・・・・・・ 351 コラム if と#ifdef の違いは何か ・・・・・・・・・・・・・・・・・・・・ 354 コラム スイッチを組み込む理由 ・・・・・・・・・・・・・・・・・・・・・・ 356 もっとエレガントに判断する ・・・・・・・・・・・・・・・・・・・・・・ 356 コラム 長い文字列を分割して記述する ・・・・・・・・・・・・・・ 360 デバッグの手助けに使うマクロ ・・・・・・・・・・・・・・・・・・・・ 361 コンパイルした日時を記録する ・・・・・・・・・・・・・・・・・・・・ 365 コラム 既存のマクロを調べる ・・・・・・・・・・・・・・・・・・・・・・・・ 366 コラム 文字列化と名前の連結 ・・・・・・・・・・・・・・・・・・・・・・・・ 367 コラム マクロの解除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 369 コラム 入力を処理するscanf ・・・・・・・・・・・・・・・・・・・・・・・・ 371
複数のソースファイルに分けて書く 373 プログラミングを3 人で分担 ・・・・・・・・・・・・・・・・・・・・・・ 374 モジュール化プログラミングの考え方 ・・・・・・・・・・・ 374 モジュール間の関係を取り決める ・・・・・・・・・・・・・・・・・ 376 リンクをせずにコンパイルだけする ・・・・・・・・・・・・・・ 379 実行できないファイルを作成する理由 ・・・・・・・・・・・ 381 ヘッダファイルのもう1 つの効能 ・・・・・・・・・・・・・・・・・ 382 おっと設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 384 またまた設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 386 同じ名前の関数の衝突回避 ・・・・・・・・・・・・・・・・・・・・・・・・・ 387 いよいよ実行ファイルを作る ・・・・・・・・・・・・・・・・・・・・・・ 388 モジュール化プログラミングとは何か ・・・・・・・・・・・ 389 コラム モジュール間で変数を共有する方法 ・・・・・・・・・ 392 コラム 構造化とオブジェクト指向とモジュール化 ・・・・ 393 コラム 関数の前方参照と関数原型宣言 ・・・・・・・・・・・・・・ 394 コラム unsafe 警告の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 396
実行ファイル作成の自動化 397 横着は人類を進歩させる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 398 make でHello World! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 399 もっと楽をしたいぞ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 402 集計プログラムの実行にmake を試す ・・・・・・・・・・・ 403 make の秘密はタイムスタンプにあり ・・・・・・・・・・・・ 405 シンプルな一発make ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 407 オブジェクトファイル単位に分けるmake ・・・・・・ 409 full.mak の説明 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 412 コラム make の仲間たち ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 414 vi vii Cgen_000_iv_ix_moku(06).indd 6-7 09.2.27 2:06:46 PM 目次
実行ファイル作成の効率化 415 make の快楽 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 416 暗黙のルールで依存関係をシンプルに ・・・・・・・・・・・ 418 マクロによる記述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 422 定義済みのルール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 425 ターゲット指定による作り分け ・・・・・・・・・・・・・・・・・・・・ 426 ゴミ掃除の自動化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 429 コラム メイクファイルもインクルード ・・・・・・・・・・・・・・ 431 コラム コマンドラインでのマクロ指定 ・・・・・・・・・・・・・・ 432
入口1 つで出口が2 つ 433 あなたの目の前にある標準エラー出力 ・・・・・・・・・・・ 434 決まり切ったメッセージの抑止 ・・・・・・・・・・・・・・・・・・・・ 436 標準エラー出力への出力方法 ・・・・・・・・・・・・・・・・・・・・・・ 437 エラー処理を強化する切り札perror ・・・・・・・・・・・・・・ 440 perror の引数の書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 444 より確実なプログラムにするには ・・・・・・・・・・・・・・・・・ 445 実際のプログラムで使う標準エラー出力 ・・・・・・・・・ 447 コラム 標準C とエラー番号 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 454
画像データも扱おう 455 バイナリファイルとは何か? ・・・・・・・・・・・・・・・・・・・・・・ 456 BMP ファイルの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 458 BMP ファイルを加工する ・・・・・・・・・・・・・・・・・・・・・・・・・・ 460 画像を処理する仕掛け ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 463 パイプを通らないバイナリ ・・・・・・・・・・・・・・・・・・・・・・・・・ 466 強力画像加工ツールnetpbm ・・・・・・・・・・・・・・・・・・・・・・・ 470 標準入出力でバイナリを扱う方法 ・・・・・・・・・・・・・・・・・ 471 連携でパワーアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 473 コラム テキストファイルとワープロ文書 ・・・・・・・・・・・・ 475 コラム テキストファイルとOOXML ・・・・・・・・・・・・・・・・ 476 コラム テキストファイル形式の画像ファイル ・・・・・・・ 476 コラム fopen 関数で“b”が必要とされるケース ・・・・ 477 コラム 改行の混乱 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 477 コラム 筆者の実体験 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 478 コラム _setmode 関数が必要とされないとき ・・・・・・・ 478
オブジェクト指向「風」プログラミングの入口 479 C とオブジェクト指向プログラミング ・・・・・・・・・・・ 480 ポリモーフィズム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 480 関数へのポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 482 構造体でオブジェクトを表現 ・・・・・・・・・・・・・・・・・・・・・・ 486 ポリモーフィズムの活用例 ・・・・・・・・・・・・・・・・・・・・・・・・・ 486 オブジェクトを作るファクトリ ・・・・・・・・・・・・・・・・・・・・ 490 コラム 乱数を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 490 「より良く書くことができる」世界へ踏みだそう! ・・・ 492 コラム「 スローフード」としてのC 言語 ・・・・・・・・・・・・・ 493
インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496 入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496 動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 502
インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 504 入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 505 動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 513 環境変数の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 514
こだわりの文字ダンプ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 518 ソースコードの解説 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 519
cl やgcc を実行できる謎 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 524 環境変数というカスタマイズ手段 ・・・・・・・・・・・・・・・・・ 525 自分専用の環境変数を作ろう ・・・・・・・・・・・・・・・・・・・・・・ 527 環境変数でカスタマイズ可能なプログラム ・・・・・・ 529 プログラムから環境変数を書き換える ・・・・・・・・・・・ 531 書き込んでも環境変数が変わらない理由 ・・・・・・・・・ 532 子プロセスには引き継げる ・・・・・・・・・・・・・・・・・・・・・・・・・ 533 コラム 環境変数の削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 536 コラム 環境変数の恒久的な書き換え ・・・・・・・・・・・・・・・・・ 537 コラム 環境変数PATH の書き換え ・・・・・・・・・・・・・・・・・・ 537
ヘッダファイルの書き忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・ 540 main 関数名前間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 540 変数の宣言忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 541 宣言したのに使われない変数 ・・・・・・・・・・・・・・・・・・・・・・ 542 同じ名前の変数を2 つ定義 ・・・・・・・・・・・・・・・・・・・・・・・・・ 542 別の型の変数に代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 543 存在しない関数の呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・ 544 違う型の値を関数に渡す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545 関数の引数が多すぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545 関数の引数が少なすぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 546 引用符忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 547 引用符の種類間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548 文字列中の円記号 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548 実数から整数への代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 549 括弧の数が合わない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 550 全角文字で書いた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551 全角空白を入れた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551 ソースコードをUnicode 形式で保存した ・ ・・・・・・ 552 安全ではない関数を使用した ・・・・・・・・・・・・・・・・・・・・・・ 553
デバッガでプログラムを覗く ・・・・・・・・・・・・・・・・・・・・・・ 556 デバッガでステップ実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 559 その他の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 561