C言語教科書【入門編】

まえがき

 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つの連載と、他の一部の記事原稿を再構成したものです。内容を全面的に見直し、大幅な加筆修正も行っています。また、雑誌掲載時に誌面の都合でカットされたコラムなども大幅に復活していますので、連載をお読みになった方もご注目ください。本書が真の完全版です。

目次

 以下は校正版ベースなのでページ数等に相違があるかもしれません。

まえがき ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ iii

第1部 初めてC に触れる

第1章 C 言語とは

C はあなたに何を与えるか 1
なぜC を学ぶのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 2
プログラミング言語とは何か ・・・・・・・・・・・・・・・・・・・・・・・・・ 2
C を学ぶもう1 つの理由 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 4
なぜ教科書を用いるのか ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 5
コラム プログラムとソフトウェア ・・・・・・・・・・・・・・・・・・・・・・ 6
コラム チャレンジ問題と採点プログラム ・・・・・・・・・・・・・・・ 6

第2章 コマンドライン操作

シンプルかつ強力な操作体系 9
文字による操作に取り組もう ・・・・・・・・・・・・・・・・・・・・・・・・ 10
コマンドプロンプトを操作する ・・・・・・・・・・・・・・・・・・・・・・ 11
拡張子の役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 13
コラム テキストエディタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 15
コマンドライン ヒストリの活用 ・・・・・・・・・・・・・・・・・・・・・ 15
基本的なコマンド ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 16
ワイルドカード ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 19
処理を自動化するバッチ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 20
実行するコマンドの指定方法 ・・・・・・・・・・・・・・・・・・・・・・・・ 21
コラム Windows 以外で使用するコマンド ・・・・・・・・・・・・ 22

第3章 ハローワールド

最も簡単なプログラム 23
ハローワールドを書く ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24
コンパイラの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 24
C 言語に関するファイルの役割 ・・・・・・・・・・・・・・・・・・・・・・ 25

第4章 Visual C++ の使い方 29

Visual C++ の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 30
統合開発環境を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 31
ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 33
プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 36
コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
ソースファイルの作成 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 38
コンパイル ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 40
プログラムの実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 41

第5章 gcc(MinGW)の使い方 43

gcc の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44
MinGW の概要 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 44
コマンドラインを使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 45
実行ファイル名を指定する ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 46
ソースファイルに日本語文字を書き込む ・・・・・・・・・・・ 47
コラム エラーの起こる文字一覧プログラム ・・・・・・・・・・・ 50
コラム cp932 の指定が有効にならないケース ・・・・・・・・ 50

第6章 標準出力

ファイルにも画面にも出力 53
ハローワールドプログラムをとことん楽しむ・・・・・・ 54
わずかな労力で多くの機能を ・・・・・・・・・・・・・・・・・・・・・・・・ 57
最初に実行される関数main ・・・・・・・・・・・・・・・・・・・・・・・・・・ 60
ライブラリという機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 60
ライブラリ活用のためのヘッダファイル ・・・・・・・・・・・ 62

第7章 標準入力

キーボードやファイルから入力 65
「決まり切った文字列」を卒業しよう ・・・・・・・・・・・・・・・・ 66
標準入力のチカラ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 68
プログラムの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 69
コラム バッファオーバーランの危険 ・・・・・・・・・・・・・・・・・・・ 71
コラム _mbsupr 関数を使わずに記述する ・・・・・・・・・・・・ 72

第8章 条件判断

プログラムに賢さを与える 73
知恵のタネとなる条件判断 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74
もしも入力が空だったら? ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 74
ソースコードの説明 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 76
コラム どこにも送られない特殊なファイル名 ・・・・・・・・・ 68
金額によって処理を分ける ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 79
コラム 整数とは ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 82
コラム さまざまな条件 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
コラム return 文 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
合い言葉は「山」「川」 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 84
コラム その他の条件判断機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 89
コラム 文字列の比較に== を使用できない理由 ・・・・・・ 89

第9章 繰り返し

プログラムに力を与える 91
プログラムの「力」は繰り返しにあり ・・・・・・・・・・・・・・・・ 92
羊を数える ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 93
回数を指定した繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 98
2 重の繰り返し ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 103
コラム 繰り返しに使う変数名 ・・・・・・・・・・・・・・・・・・・・・・・・ 104
Upper1 を任意の行数に拡張する ・・・・・・・・・・・・・・・・・ 107
コラム コントロールキーの活用 ・・・・・・・・・・・・・・・・・・・・・・ 112
コラム 繰り返しはパターンを決めよう ・・・・・・・・・・・・・・ 112
コラム 決まらない回数の繰り返し ・・・・・・・・・・・・・・・・・・・ 113

第10章 配列と文字列

文字イコール数値という不思議 115
多数のデータを効率よく記憶する配列 ・・・・・・・・・・・ 116
複数の番号について集計する ・・・・・・・・・・・・・・・・・・・・・・ 117
配列の範囲外アクセス ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 121
文字列イコール配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 123
コラム ' ¥n' と" ¥n" の違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 127
文字とは実は数字である ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 128
漢字を正しく逆転させるには ・・・・・・・・・・・・・・・・・・・・・・ 132
10 進数と16 進数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 132
1 バイト文字と2 バイト文字の区別 ・・・・・・・・・・・・・・ 135
コラム 配列の範囲外アクセスの必要性 ・・・・・・・・・・・・・・ 139
コラム setlocale 関数の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・ 140
コラム 1 バイト目と2 バイト目の英語表記 ・・・・・・・・・ 140
コラム データの入った配列を宣言する ・・・・・・・・・・・・・・ 141
コラム 文字列の入った配列を宣言する ・・・・・・・・・・・・・・ 142

第11章 ポインタ

最大の難敵にして最強の味方 143
さあ、いよいよポインタだ ・・・・・・・・・・・・・・・・・・・・・・・・・ 144
メモリ空間は巨大な配列 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 144
ポインタでメモリ空間を扱う ・・・・・・・・・・・・・・・・・・・・・・ 149
ポインタを知ればライブラリ関数を活用できる ・・・ 154
整数型のポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 158
コラム char とunsigned char ・・・・・・・・・・・・・・・・・・・・・・ 162
コラム なぜunsigned char を使うのか? ・・・・・・・・・・ 162
コラム 配列ではない変数のポインタ値を得る ・・・・・・・ 163
コラム 数値をバラバラに分解する ・・・・・・・・・・・・・・・・・・・ 164
コラム データのサイズの注意 ・・・・・・・・・・・・・・・・・・・・・・・・ 166

第12章 関数

同じコードを繰り返し書く無駄を排除せよ 167
一括置換では直せない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168
重複を取り除こう ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 169
関数を自作する ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 172
引数を使って関数自由自在 ・・・・・・・・・・・・・・・・・・・・・・・・・ 175
返却値で結果を返す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 168
有効範囲(スコープ)という罠 ・・・・・・・・・・・・・・・・・・・・・・ 182
main 関数の引数と返却値を使う ・・・・・・・・・・・・・・・・・・ 186
引数の受け取り方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 189
返却値の返し方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 190

第13章 構造体

データを結集すれば力も倍増 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

第14章 ファイル入出力

複数のファイルを自在に操れ 219
標準入出力からの巣立ち ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 220
この2 つのファイルは同じものか? ・・・・・・・・・・・・・・ 220
ファイルを比較する方法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 224
ファイルのオープンとクローズ ・・・・・・・・・・・・・・・・・・・・ 226
gets 関数とfgets 関数の相違点 ・・・・・・・・・・・・・・・・・・・ 228
複数のファイルを1 つにまとめる ・・・・・・・・・・・・・・・・・ 230
複数のファイルに分割して書き込む ・・・・・・・・・・・・・・ 235
コラム fclose 関数の効能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 240
コラム FILE 構造体の定義 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 242

第15章 小さな実用ソフト

検索+ソート+ユニークの自作に挑戦 243
効果的なC の学習法 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244
検索、ソート、ユニーク ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 244
ワイルドカード対応の検索ツール ・・・・・・・・・・・・・・・・・ 247
1 つの繰り返しを1 つの関数で ・・・・・・・・・・・・・・・・・・・・ 251
順番に並べ替えるソート ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 256
泡のようにソートせよ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 258
bsort のソースを読む ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 259
バブルソートを行う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 262
ユニークな結末 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 264
コラム DBCS イネーブリング ・・・・・・・・・・・・・・・・・・・・・・・・ 265
コラム true とfalse ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 266
コラム qsort 関数のアルゴリズム ・・・・・・・・・・・・・・・・・・・ 266

第16章 デバッグ

“本物”のプログラマに必須のテクニック 267
誤りはどうしても入り込む ・・・・・・・・・・・・・・・・・・・・・・・・・ 268
デバッグの重要性 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 270
デバッガを使わないデバッグ ・・・・・・・・・・・・・・・・・・・・・・ 271
名探偵を目指せ——推理と絞り込み ・・・・・・・・・・・・・・ 271
違う角度からソースを見る ・・・・・・・・・・・・・・・・・・・・・・・・・ 273
誰もが知る有名テクニック——printf デバッグ ・・・・ 274
コラム 使い終わったprintf 関数呼び出しの処置 ・・・ 278
ファイルへのデバッグ出力 ・・・・・・・・・・・・・・・・・・・・・・・・・ 279
あるべき値を保証するassert ・・・・・・・・・・・・・・・・・・・・・・ 282
デバッグ用途に使うassert ・・・・・・・・・・・・・・・・・・・・・・・・ 284
コラム C では特に重要なデバッグ ・・・・・・・・・・・・・・・・・・・ 287
コラム 原因を絞り込めないケース ・・・・・・・・・・・・・・・・・・・ 287
コラム 自分に責任のないバグ ・・・・・・・・・・・・・・・・・・・・・・・・ 288
コラム assert マクロはエラーチェック用ではない ・・・・ 288

第17章 実用プログラムの開発

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

第2部 入門者を卒業する

第18章 式と演算子

優先順位にご用心 317
C 言語における式 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348
演算子の一覧 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 348
優先順位の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 320
コラム 式の評価の難しさ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 321

第19章 マクロ

それはソースの自動書き換え 323
C なのにVisual Basic 風? ・・・・・・・・・・・・・・・・・・・・・・・ 324
ヘッダファイルとマクロのトリック ・・・・・・・・・・・・・・ 327
マクロの役割 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 331
関数のように使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 334
マクロの副作用 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 337
長いマクロの書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 338
マクロの性能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 341
マクロの使い過ぎは肥満の元 ・・・・・・・・・・・・・・・・・・・・・・ 344
コラム 整数と実数 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 347

第20章 高度なマクロ

ソースを差し替え、コンパイル時刻を刻み込む 349
品川までは何マイル? ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 350
条件判断に使うマクロ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 351
#ifdef で実現する品川からの距離 ・・・・・・・・・・・・・・・・ 351
コラム if と#ifdef の違いは何か ・・・・・・・・・・・・・・・・・・・・ 354
コラム スイッチを組み込む理由 ・・・・・・・・・・・・・・・・・・・・・・ 356
もっとエレガントに判断する ・・・・・・・・・・・・・・・・・・・・・・ 356
コラム 長い文字列を分割して記述する ・・・・・・・・・・・・・・ 360
デバッグの手助けに使うマクロ ・・・・・・・・・・・・・・・・・・・・ 361
コンパイルした日時を記録する ・・・・・・・・・・・・・・・・・・・・ 365
コラム 既存のマクロを調べる ・・・・・・・・・・・・・・・・・・・・・・・・ 366
コラム 文字列化と名前の連結 ・・・・・・・・・・・・・・・・・・・・・・・・ 367
コラム マクロの解除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 369
コラム 入力を処理するscanf ・・・・・・・・・・・・・・・・・・・・・・・・ 371

第21章 モジュール化プログラミング

複数のソースファイルに分けて書く 373
プログラミングを3 人で分担 ・・・・・・・・・・・・・・・・・・・・・・ 374
モジュール化プログラミングの考え方 ・・・・・・・・・・・ 374
モジュール間の関係を取り決める ・・・・・・・・・・・・・・・・・ 376
リンクをせずにコンパイルだけする ・・・・・・・・・・・・・・ 379
実行できないファイルを作成する理由 ・・・・・・・・・・・ 381
ヘッダファイルのもう1 つの効能 ・・・・・・・・・・・・・・・・・ 382
おっと設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 384
またまた設計変更だ! ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 386
同じ名前の関数の衝突回避 ・・・・・・・・・・・・・・・・・・・・・・・・・ 387
いよいよ実行ファイルを作る ・・・・・・・・・・・・・・・・・・・・・・ 388
モジュール化プログラミングとは何か ・・・・・・・・・・・ 389
コラム モジュール間で変数を共有する方法 ・・・・・・・・・ 392
コラム 構造化とオブジェクト指向とモジュール化 ・・・・ 393
コラム 関数の前方参照と関数原型宣言 ・・・・・・・・・・・・・・ 394
コラム unsafe 警告の問題 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 396

第22章 make 入門

実行ファイル作成の自動化 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
目次

第23章 make 入門その2

実行ファイル作成の効率化 415
make の快楽 ・ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 416
暗黙のルールで依存関係をシンプルに ・・・・・・・・・・・ 418
マクロによる記述 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 422
定義済みのルール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 425
ターゲット指定による作り分け ・・・・・・・・・・・・・・・・・・・・ 426
ゴミ掃除の自動化 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 429
コラム メイクファイルもインクルード ・・・・・・・・・・・・・・ 431
コラム コマンドラインでのマクロ指定 ・・・・・・・・・・・・・・ 432

第24章 標準エラー出力

入口1 つで出口が2 つ 433
あなたの目の前にある標準エラー出力 ・・・・・・・・・・・ 434
決まり切ったメッセージの抑止 ・・・・・・・・・・・・・・・・・・・・ 436
標準エラー出力への出力方法 ・・・・・・・・・・・・・・・・・・・・・・ 437
エラー処理を強化する切り札perror ・・・・・・・・・・・・・・ 440
perror の引数の書き方 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 444
より確実なプログラムにするには ・・・・・・・・・・・・・・・・・ 445
実際のプログラムで使う標準エラー出力 ・・・・・・・・・ 447
コラム 標準C とエラー番号 ・・・・・・・・・・・・・・・・・・・・・・・・・・ 454

第25章 バイナリファイル

画像データも扱おう 455
バイナリファイルとは何か? ・・・・・・・・・・・・・・・・・・・・・・ 456
BMP ファイルの構造 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 458
BMP ファイルを加工する ・・・・・・・・・・・・・・・・・・・・・・・・・・ 460
画像を処理する仕掛け ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 463
パイプを通らないバイナリ ・・・・・・・・・・・・・・・・・・・・・・・・・ 466
強力画像加工ツールnetpbm ・・・・・・・・・・・・・・・・・・・・・・・ 470
標準入出力でバイナリを扱う方法 ・・・・・・・・・・・・・・・・・ 471
連携でパワーアップ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 473
コラム テキストファイルとワープロ文書 ・・・・・・・・・・・・ 475
コラム テキストファイルとOOXML ・・・・・・・・・・・・・・・・ 476
コラム テキストファイル形式の画像ファイル ・・・・・・・ 476
コラム fopen 関数で“b”が必要とされるケース ・・・・ 477
コラム 改行の混乱 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 477
コラム 筆者の実体験 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 478
コラム _setmode 関数が必要とされないとき ・・・・・・・ 478

第26章 関数へのポインタ

オブジェクト指向「風」プログラミングの入口 479
C とオブジェクト指向プログラミング ・・・・・・・・・・・ 480
ポリモーフィズム ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 480
関数へのポインタ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 482
構造体でオブジェクトを表現 ・・・・・・・・・・・・・・・・・・・・・・ 486
ポリモーフィズムの活用例 ・・・・・・・・・・・・・・・・・・・・・・・・・ 486
オブジェクトを作るファクトリ ・・・・・・・・・・・・・・・・・・・・ 490
コラム 乱数を使う ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 490
「より良く書くことができる」世界へ踏みだそう! ・・・ 492
コラム「 スローフード」としてのC 言語 ・・・・・・・・・・・・・ 493

付録1  Visual C++ 2008 Express Edition のインストール 495

インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496
入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 496
動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 502

付録2 MinGW のインストール 503

インストール環境の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 504
入手とインストール ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 505
動作の確認 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 513
環境変数の設定 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 514

付録3 16進ダンププログラムhexdump 517

こだわりの文字ダンプ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 518
ソースコードの解説 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 519

付録4 環境変数 523

cl やgcc を実行できる謎 ・・・・・・・・・・・・・・・・・・・・・・・・・・・ 524
環境変数というカスタマイズ手段 ・・・・・・・・・・・・・・・・・ 525
自分専用の環境変数を作ろう ・・・・・・・・・・・・・・・・・・・・・・ 527
環境変数でカスタマイズ可能なプログラム ・・・・・・ 529
プログラムから環境変数を書き換える ・・・・・・・・・・・ 531
書き込んでも環境変数が変わらない理由 ・・・・・・・・・ 532
子プロセスには引き継げる ・・・・・・・・・・・・・・・・・・・・・・・・・ 533
コラム 環境変数の削除 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 536
コラム 環境変数の恒久的な書き換え ・・・・・・・・・・・・・・・・・ 537
コラム 環境変数PATH の書き換え ・・・・・・・・・・・・・・・・・・ 537

付録5  コンパイラの主要なエラーメッセージと対策 539

ヘッダファイルの書き忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・ 540
main 関数名前間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 540
変数の宣言忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 541
宣言したのに使われない変数 ・・・・・・・・・・・・・・・・・・・・・・ 542
同じ名前の変数を2 つ定義 ・・・・・・・・・・・・・・・・・・・・・・・・・ 542
別の型の変数に代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 543
存在しない関数の呼び出し ・・・・・・・・・・・・・・・・・・・・・・・・・ 544
違う型の値を関数に渡す ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545
関数の引数が多すぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 545
関数の引数が少なすぎる ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 546
引用符忘れ ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 547
引用符の種類間違い ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548
文字列中の円記号 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 548
実数から整数への代入 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 549
括弧の数が合わない ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 550
全角文字で書いた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551
全角空白を入れた ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 551
ソースコードをUnicode 形式で保存した ・ ・・・・・・ 552
安全ではない関数を使用した ・・・・・・・・・・・・・・・・・・・・・・ 553

付録6  デバッガを使ったデバッグVisual C++ 編 555

デバッガでプログラムを覗く ・・・・・・・・・・・・・・・・・・・・・・ 556
デバッガでステップ実行 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 559
その他の機能 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ 561

あとがき・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・562

索引 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・563


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-10-20 (火) 15:31:44