C言語のきほん|C言語の標準ライブラリ関数

C言語をもっとラクに、もっと確実に。標準ライブラリ関数を知ると、プログラム作りはぐっと楽しくなる

これまでの学習では、printf や scanf を使って、画面に文字を表示したり、キーボードから値を受け取ったりしてきました。こうした関数は、C言語に最初から用意されている便利な機能のひとつです。これらはまとめて標準ライブラリ関数と呼ばれます。

C言語は、必要最小限の文法でできている、とてもシンプルな言語です。
その一方で、文字列の長さを調べる、文字の種類を判定する、乱数を作る、平方根を求める、メモリを確保するといった実用的な処理まで、すべて文法だけで書こうとすると大変です。そこで活躍するのが標準ライブラリ関数です。

たとえば、文字列の長さを知りたいときに、自分で 1文字ずつ数える処理を書くこともできます。ですが、そのたびに同じような処理を一から書くのは手間がかかりますし、バグの原因にもなります。そんなときに strlen を使えば、すでに用意された信頼性の高い処理をそのまま利用できます。

つまり、標準ライブラリ関数を使えるようになると、次のようなよいことがあります。

利点内容
開発が速くなるよく使う処理を自分で作らずにすぐ使える
ミスを減らせる長年使われてきた定番の処理を利用できる
読みやすくなる処理の意味が関数名から伝わりやすい
移植しやすい規格に沿った関数なので環境が変わっても使いやすい

C言語の学習では、つい 文法を覚えること に意識が向きがちですが、実際にプログラムを書くときには、どの標準ライブラリ関数を使えばよいか知っていることも同じくらい大切です。
むしろ、実用的なプログラムを作る力は、文法とライブラリ関数の両方がそろってこそ身についていきます。

この章では、C言語の標準ライブラリ関数とは何か、なぜ使うのか、どのような種類があるのかをていねいに見ていきます。関数そのものを丸暗記するのではなく、どんな場面で役立つのかをイメージしながら学んでいきましょう。

標準ライブラリ関数とは何か

標準ライブラリ関数とは、C言語の規格に基づいてあらかじめ用意されている関数のことです。
プログラマはそれらを呼び出すだけで、よく使う処理を簡単に実現できます。

たとえば、次のような処理は標準ライブラリ関数で行えます。

  • 文字を表示する
  • 文字列の長さを調べる
  • 文字が数字かどうか判定する
  • 小文字を大文字に変換する
  • 平方根を求める
  • 乱数を作る
  • メモリを動的に確保する
  • 現在時刻を取得する

つまり、標準ライブラリ関数は、C言語でプログラムを書くときの便利な道具箱のようなものです。
自分でゼロから作ることもできる処理はありますが、すでに使いやすく整えられた道具があるなら、それを使ったほうが効率的です。

なぜ標準ライブラリ関数を使うのか

標準ライブラリ関数を使う理由はたくさんありますが、特に大切なのは効率性、信頼性、移植性の3つです。

効率性

標準ライブラリ関数を使えば、複雑な処理でも短いコードで書けます。
たとえば、文字列の長さを求めたいときに strlen を使えば、1行で済みます。

自分で1文字ずつ数える処理を書くことも可能ですが、そのたびにループを書いて、終端文字 \0 を確認して、カウントを増やして……という手間がかかります。標準ライブラリ関数なら、その手間を省けます。

信頼性

標準ライブラリ関数は、多くの環境で長年使われてきた実績があります。
そのため、自作の処理よりも安定して動作することが多く、安心して利用しやすいです。

もちろん、使い方を誤れば問題は起こります。ですが、少なくとも「よくある処理を毎回自分で書く」よりは、定番の関数を正しく使うほうが安全です。

移植性

C言語の標準ライブラリ関数は、C言語の規格に基づいて定義されています。
そのため、Windows、Linux、macOS など環境が違っても、同じ考え方で使えるものが多いです。

これはとても大きな利点です。環境ごとに処理を書き換える必要が減るので、別の開発環境に移しても再利用しやすくなります。

自分で書くより、標準ライブラリ関数を使ったほうがよい例

たとえば、英大文字を小文字に変換したい場面を考えてみましょう。
初心者のうちは、文字コードの差を利用して次のように書きたくなることがあります。

if (ch >= 'A' && ch <= 'Z') {
    ch += ('a' - 'A');
}

この書き方は、ASCII ベースの文字コードではよく見かけます。
ただし、この方法は文字コードの並び方に依存した書き方です。現代の多くの環境では問題になりにくいものの、考え方としては環境依存の要素を含んでいます。

それに対して、標準ライブラリ関数の tolower を使えば、次のように書けます。

ch = tolower(ch);

こちらのほうが、何をしたいのかがはっきりしています。
「大文字なら小文字に変換する」という意図が、そのままコードに表れています。

この違いはとても大切です。
プログラムは、動けばよいだけではなく、読みやすく、意図が伝わることも重要です。標準ライブラリ関数は、その助けにもなってくれます。

身近なたとえでイメージしてみよう

標準ライブラリ関数は、市販のカレールーにたとえるとわかりやすいです。

カレーを作るとき、スパイスをすべて自分で調合して作ることもできます。
でも、それには知識も経験も必要ですし、毎回同じ味に仕上げるのは簡単ではありません。

一方、市販のルーを使えば、手軽に、安定して、おいしいカレーを作れます。

C言語でも同じです。
自分で処理を一から作ることは大切な学習になりますが、実際のプログラムでは、使える標準ライブラリ関数があるなら、それを活用するほうが合理的です。

この図では、左側の市販のカレールーが、右側の標準ライブラリ関数に対応しています。
カレールーを使えば、調合を毎回自分で考えなくても、安定した味に仕上げやすくなります。
同じように、標準ライブラリ関数を使えば、毎回同じ処理を自作しなくても、効率よく、安心して、環境をまたいで使いやすいプログラムを書けるようになります。

こうした比喩を使うと、標準ライブラリ関数の価値が単なる機能一覧ではなく、実務で役立つ道具として伝わりやすくなります。

ヘッダファイルとの関係を理解しよう

標準ライブラリ関数を使うときは、関数に対応したヘッダファイルを読み込む必要があります。
ヘッダファイルは、その関数がどのような名前で、どんな引数を受け取り、何を返すのかといった情報をプログラムに伝えるためのものです。

たとえば、printf を使うなら stdio.h、strlen を使うなら string.h、tolower を使うなら ctype.h をインクルードします。

対応関係の例を表にすると、次のようになります。

ヘッダファイル主な関数用途
stdio.hprintf, scanf, puts, fgets入出力
string.hstrlen, strcpy, strcmp, strcat文字列操作
ctype.hisdigit, isalpha, toupper, tolower文字の判定や変換
math.hsqrt, pow, sin, cos数学計算
stdlib.hmalloc, free, rand, atoi汎用機能
time.htime, clock, strftime時刻や時間

ヘッダファイルを読み込むときは、プログラムの先頭で include を書きます。

#include <stdio.h>
#include <string.h>

このように書くことで、printf や strlen などを使えるようになります。

ヘッダファイルが必要な理由

ヘッダファイルを使う理由は、コンパイラに「この関数はこういう形です」と知らせるためです。

たとえば strlen は、文字列を受け取って、その長さを返す関数です。
コンパイラがその情報を知らないまま使うと、正しくチェックできず、警告やエラーの原因になることがあります。

つまり、ヘッダファイルは単なるおまけではなく、関数を安全に正しく使うための案内書のようなものです。

シンプルなプログラム例で見てみよう

ここでは、サンプルプログラムをよりシンプルで親しみやすい例に置き換えてみます。
画面にメッセージを表示し、その文字列の長さを調べるプログラムです。

ファイル名:12_1_1.c

#include <stdio.h>
#include <string.h>

int main(void)
{
    char message[] = "C言語の学習を楽しもう";

    /* メッセージを表示する */
    puts(message);

    /* 文字列の長さを表示する */
    printf("文字数は %zu です。\n", strlen(message));

    return 0;
}

このプログラムで使っている関数

関数名ヘッダファイル役割
putsstdio.h文字列を表示して改行する
printfstdio.h書式付きで表示する
strlenstring.h文字列の長さを調べる

このプログラムのポイント

このプログラムでは、message という文字配列に日本語のメッセージを入れています。
puts(message); で、その内容をそのまま画面に表示しています。

次に strlen(message) を使って、その文字列の長さを求めています。
このように、標準ライブラリ関数を使えば、文字列の長さを自分で数える処理を書かなくてもよくなります。

なお、日本語文字列の扱いは文字コードの種類によって見え方やバイト数の考え方が少し複雑になることがあります。ここでは「文字列の長さを調べる関数を呼び出して使える」という基本イメージをつかむことが大切です。

主な標準ライブラリ関数を知っておこう

C言語の標準ライブラリ関数はとてもたくさんあります。
最初から全部覚える必要はありませんが、どんな種類があるかを知っておくことはとても大切です。

知らないと、「本当は便利な関数があるのに、自分で全部書いてしまう」ということが起こりやすいからです。

標準入出力関数

画面表示やキーボード入力に関する関数です。

関数名説明
printf書式付きで画面に出力する
scanf書式付きでキー入力する
putchar1文字を画面に出力する
getchar1文字をキー入力する
puts文字列を出力して改行する
fgets文字列を入力する

これらは、C言語を学び始めたときからよく使う関数です。
特に printf と puts は、動作確認や結果表示で頻繁に登場します。

文字列操作関数

文字列をコピーしたり、比較したり、連結したりするときに使います。

関数名説明
strlen文字列の長さを取得する
strcpy文字列をコピーする
strncpy指定した長さだけコピーする
strcat文字列を連結する
strncat指定した長さだけ連結する
strcmp文字列を比較する
strncmp指定した長さだけ比較する
strchr文字列内から文字を探す
strstr文字列内から部分文字列を探す

文字列処理は、C言語ではとても重要です。
C言語には文字列専用の型がなく、文字配列として扱うため、標準ライブラリ関数の存在が特にありがたく感じられます。

文字操作関数

1文字が数字か、英字か、大文字かといった判定や変換を行います。

関数名説明
isalpha英字か判定する
isdigit数字文字か判定する
isalnum英数字か判定する
isupper英大文字か判定する
islower英小文字か判定する
isspace空白文字か判定する
toupper小文字を大文字に変換する
tolower大文字を小文字に変換する

このグループは、入力文字のチェックや整形で役立ちます。
ユーザーが入力した1文字が数字かどうか確かめるときなどに便利です。

数学関数

計算を助ける関数です。

関数名説明
sqrt平方根を求める
powべき乗を求める
sin正弦を求める
cos余弦を求める
tan正接を求める
fabs実数の絶対値を求める
ceil切り上げる
floor切り捨てる

数学的な計算が必要なプログラムでは欠かせません。
特に sqrt や pow は、学習用プログラムでもよく使われます。

一般ユーティリティ関数

幅広い用途を持つ関数群です。

関数名説明
malloc動的メモリを割り当てる
free動的メモリを解放する
atoi文字列を整数に変換する
atof文字列を実数に変換する
rand擬似乱数を生成する
srand乱数の初期化を行う
qsort配列を並べ替える
abs整数の絶対値を求める

この中でも malloc と free は、ポインタや動的メモリを学ぶときに非常に重要です。
また rand は、ゲームや簡単なシミュレーションを作るときによく使われます。

時間関数

時間や時刻を扱う関数です。

関数名説明
time現在の時刻を取得する
clock実行時間を取得する
difftime時刻の差を計算する
strftime時刻を文字列形式に整える

たとえば、現在日時を表示したり、処理時間を測ったりするときに使えます。

どの関数を覚えるべきか

最初のうちは、すべてを一気に覚える必要はありません。
まずは、次のような「よく使う関数」から慣れていくのがおすすめです。

分野まず覚えたい関数
入出力printf, puts, scanf, fgets
文字列strlen, strcmp, strcpy
文字判定isdigit, isalpha, toupper, tolower
計算sqrt, pow
その他rand, srand, malloc, free

このあたりを使いこなせるようになると、C言語で作れるプログラムの幅がかなり広がります。

標準ライブラリ関数を学ぶときのコツ

標準ライブラリ関数は数が多いので、一覧を眺めるだけでは身につきにくいです。
学ぶときは、次のような視点を持つと理解しやすくなります。

何をする関数なのかをつかむ

関数名と説明を見て、「どんな仕事をするのか」をまず押さえます。
たとえば strlen なら「長さを調べる」、toupper なら「大文字に変える」という具合です。

どのヘッダファイルにあるかをセットで覚える

関数名だけ覚えても、使うときにヘッダファイルがわからないと困ります。
そのため、strlen は string.h、tolower は ctype.h のように、セットで覚えるのがおすすめです。

小さなプログラムで試す

一覧を読むだけでなく、短いプログラムを書いて実際に動かすと理解が深まります。
たとえば、入力された文字が数字かどうか判定するプログラム、文字列の長さを表示するプログラムなど、短くても十分効果があります。

標準ライブラリ関数を使う意識を持とう

C言語の学習では、自分で処理を書く力はもちろん大切です。
ですが、それと同じくらい大切なのが、すでに用意されている適切な関数を見つけて使う力です。

何でも自作するのは、一見がんばっているように見えますが、実際には時間がかかり、ミスも増えやすくなります。
一方で、標準ライブラリ関数を活用できる人は、短く、読みやすく、安定したプログラムを書きやすくなります。

C言語の標準ライブラリ関数は、単なる便利機能ではありません。
よりよいプログラムを書くための基本の道具です。
この章では、そうした道具をひとつずつ知り、使いこなせるようになるための土台を作っていきましょう。