| 294 | == 標準ライブラリを使ってみる == |
| 295 | |
| 296 | 言語をしっかり習得するには文法を学び、そこに通じるさまざまな思想や観念を学ぶことが必要ですが、そうしたものを一通り学んでまともに動くプログラムを組み上げるまでの道のりは長く、よっぽど好きでもない限り退屈なものでしょう。 |
| 297 | |
| 298 | そこで、とりあえず動くものを作ってしまう最も手っ取り早い方法として、他の言語では普通に用意されていそうな命令の代わりになる関数がたくさん盛り込まれている'''標準ライブラリ'''から学んでしまうことにしましょう。 |
| 299 | |
| 300 | === 文字を表示する === |
| 301 | |
| 302 | コンソール上に文字を表示する関数の類は、入出力ライブラリとしてまとめられています。入出力ライブラリを使用するには、プログラムの先頭に stdio.h ファイルを読み込ませる必要があります。 |
| 303 | |
| 304 | {{{ |
| 305 | #include <stdio.h> |
| 306 | }}} |
| 307 | |
| 308 | 番号記号 "#" で始まる行を'''プリプロセッサ行'''といいます。プリプロセッサとはその名の通り「前処理」を行うツールで、 C コンパイラコマンドがコンパイルを行う前に行う仕事です[[FootNote(思い出しましょう。 C コンパイラの仕事は、 1 に前処理、 2 にコンパイル、 3 にアセンブル、最後にリンク、でしたね。)]]。プリプロセッサは include という命令を、「その位置に指定されたファイルの内容を挿入する」と解釈します。 |
| 309 | |
| 310 | ヘッダファイルを読み込むことにより、ライブラリに用意されている関数を呼び出す準備ができました。それでは、文字を表示する関数を一つ一つ試してみましょう。 |
| 311 | |
| 312 | {{{ |
| 313 | #include <stdio.h> |
| 314 | |
| 315 | int main() |
| 316 | { |
| 317 | puts("Hello, World!"); |
| 318 | return 0; |
| 319 | } |
| 320 | }}} |
| 321 | |
| 322 | '''puts() 関数'''は、文字列を表示します。行末は改行されます。実は、 Hello World プログラムは、よく知られている printf() 関数を用いるより、 puts() 関数を用いた方がすっきり書けます。 |
| 323 | |
| 324 | なお、プログラムは必ず '''main() 関数'''の定義内容として記述します。 C 言語では、プログラムは必ず main() 関数から始まるのです。 |
| 325 | |
| 326 | {{{ |
| 327 | #include <stdio.h> |
| 328 | |
| 329 | int main() |
| 330 | { |
| 331 | int x = 4, y; |
| 332 | char formula[] = "y = x^2 + 2x + 1"; |
| 333 | printf("式: %s\nx = 4 のとき、 y = %d\n", formula, x^2 + 2 * x + 1); |
| 334 | return 0; |
| 335 | } |
| 336 | }}} |
| 337 | |
| 338 | みんな大好き '''printf() 関数'''は、書式を指定して文字列を表示する関数です。1つ目の引数は書式指定文字列で、この中に 2つ目以降の引数の値 (を文字列に変換したもの) を埋め込んで作った文字列を表示します。 |
| 339 | |
| 340 | 2つ目以降の引数の値が埋め込まれる場所は、書式指定文字列中で "%s" とか "%d" などと書かれた場所です。埋め込まれる順番は、左からの出現順です。埋め込みたい値の種類に応じて、以下の記号から選択して使用します。 |
| 341 | |
| 342 | * %s ... 文字列を埋め込む。対応する引数には char 型の配列を指定しなければならない。 |
| 343 | * %d ... 10進数の整数値を埋め込む。対応する引数には int 型などの整数値を指定する。 |
| 344 | * %h ... 16進数の整数値を埋め込む。a ~ f は小文字で表示される。対応する引数には int 型などの整数値を指定する。 |
| 345 | * %f ... 実数値を小数点表記で埋め込む。対応する引数には double 型などの実数値を指定する。 |
| 346 | * %g ... 実数値を埋め込む。通常は小数点表記だが、値の大きさによっては指数表記で表示される。対応する引数には double 型などの実数値を指定する。 |
| 347 | * %% ... % 記号そのものを表示する。 |
| 348 | |
| 349 | また、 printf() 関数は puts() 関数とは違って、行末は改行されません。改行したい場合は、改行したい場所で "\n" を挿入します。 "\n" 自体は'''エスケープシーケンス'''と呼ばれるもので、 C 言語で文字リテラルを記述する場面では共通して利用できます (つまり、 printf() 関数のみならず puts() 関数やその他の関数でも利用可能です)。エスケープシーケンスは、 "\n" の他に、以下のようなものがあります。 |
| 350 | |
| 351 | * \t ... タブ文字。 |
| 352 | * \a ... ベル文字 (アラート)[[FootNote(ブザーが鳴ります。;))]]。 |
| 353 | * \r ... 復帰。改行せずに行の先頭に戻る。 |
| 354 | * \' ... シングルクォーテーション "'"。 |
| 355 | * \" ... ダブルクォーテーション '"'。 |
| 356 | * \\ ... バックスラッシュ (円記号) "\"。 |
| 357 | |
| 358 | {{{ |
| 359 | #include <stdio.h> |
| 360 | |
| 361 | int main() |
| 362 | { |
| 363 | int i; |
| 364 | char text[] = "Hello, World!"; |
| 365 | for (i = 0; text[i] != '\0'; i++) { |
| 366 | if (i > 0) { |
| 367 | putchar(','); |
| 368 | putchar(' '); |
| 369 | } |
| 370 | putchar(test[i]); |
| 371 | } |
| 372 | return 0; |
| 373 | } |
| 374 | }}} |
| 375 | |
| 376 | '''putchar() 関数'''は、文字を一文字だけ表示する関数です。puts() 関数や printf() 関数のように文字列を表示するのではなく、一文字だけ表示します。従って、 putchar() 関数の引数には、 char 型の配列ではなく、 char 型の (単一の) 値を指定します。 |
| 377 | |
| 378 | ところで、リテラルの書き方ですが、ダブルクォーテーション '"' で括るリテラルと、シングルクォーテーション "'" で括るリテラルは、全くの別物です。ダブルクォーテーションで括った場合は'''文字列リテラル'''となりますので、 char 型の配列として扱われますが、シングルクォーテーションで括った場合は'''文字リテラル'''となり、 char 型の (単一の) 値として扱われます。 |
| 379 | |
| 380 | {{{ |
| 381 | char text[] = "Hello, World!"; /* 文字列なので、配列として扱われる */ |
| 382 | char letter = ','; /* 単一の値として扱われる */ |
| 383 | }}} |
| 384 | |
| 385 | それから、 "\0" は'''ヌル文字'''といって、 C 言語では文字列の終端を表す値として利用されています。実は、 |
| 386 | |
| 387 | {{{ |
| 388 | char text[] = "Hello, World!"; |
| 389 | }}} |
| 390 | |
| 391 | と書くのは、 |
| 392 | |
| 393 | {{{ |
| 394 | char text[] = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 10, 0 }; |
| 395 | }}} |
| 396 | |
| 397 | と書くのと同じ意味で、文字列リテラルで char 型の配列を初期化した場合、末尾にヌル文字が挿入されるというルールになっています。 |
| 398 | |