07 標準ライブラリ関数まとめ(math / stdio / stdlib / string)
C言語の標準ライブラリには、数学計算・入出力・変換・文字列操作などの便利な関数が用意されている。2級では「どの関数がどのヘッダに属するか」「戻り値の型と意味」がよく問われる。ここでは試験範囲の4つのヘッダ(<math.h> / <stdio.h> / <stdlib.h> / <string.h>)の主な関数を表にまとめる。
✅ この章のゴール:① 主要関数が属するヘッダを言える(例:sqrt/pow→math.h)② 戻り値の型と意味が分かる(例:fabs→double、strcmp→等しいと0)③ EOF/NULL/'¥0' の3つの「終わり・空」を区別できる。
💡 関数名は語源(英語の略)で覚えると忘れにくい。cpy=copy、cat=concatenate(連結)、cmp=compare(比較)、chr=character(文字)、len=length(長さ)、n=number(文字数)、r=reverse(後ろから)など。各表のかっこ内に語源を記載した。
07-1 数学関数(math.h)
数値計算を行う関数群。引数・戻り値は基本的に double 型。三角関数の角度はラジアンで与える。
| 関数 | 機能 | 語源・備考 |
cos(x) | x の余弦(コサイン)を返す(x はラジアン) | cosine |
sin(x) | x の正弦(サイン)を返す(x はラジアン) | sine |
tan(x) | x の正接(タンジェント)を返す(x はラジアン) | tangent |
exp(x) | e の x 乗を返す(指数関数) | exp=exponential(指数) |
log(x) | 自然対数(底 e)を返す(x > 0) | log=logarithm(対数) |
log10(x) | 常用対数(底 10)を返す(x > 0) | log の底10版 |
pow(x, y) | x の y 乗を返す | pow=power(累乗) |
sqrt(x) | x の平方根(ルート)を返す(x ≧ 0) | sqrt=square root(平方根) |
ceil(x) | x 以上の最小の整数に切り上げる | ceil=ceiling(天井)↑ |
floor(x) | x 以下の最大の整数に切り捨てる | floor(床)↓ |
fabs(x) | x の絶対値を返す(double 型) | f=floating-point(浮動小数点) |
✅ fabs の f は floating-point(浮動小数点)の意味で、扱うのは float ではなく double。「f だから float」と早合点しないこと。整数の絶対値は abs(stdlib.h)を使う。
⚠ ceil(天井=切り上げ↑)と floor(床=切り捨て↓)の向きを取り違えやすい。例:ceil(2.1)=3.0、floor(2.9)=2.0。どちらも戻り値は double。
07-2 入出力関数(stdio.h)
画面・キーボード・ファイルとの入出力を行う。まず覚えるべき用語・定数から。
| 用語/定数 | 説明 |
NULL | 何も指していないことを表す定数ポインタ(ヌルポインタ) |
EOF | ファイルの終端(End Of File)を示す。整数値 -1 |
FILE | ファイルを扱うための構造体の型 |
stdin / stdout / stderr | 標準入力 / 標準出力 / 標準エラー出力のストリーム |
ファイルのオープンとクローズ
| 関数 | 説明 |
fopen(filename, mode) | ファイルを開き、FILE 構造体へのポインタを返す。失敗時は NULL を返す |
fclose(stream) | ファイルを閉じる。成功時は 0、失敗時は EOF を返す |
文字単位の入出力
| 関数 | 説明 |
fgetc(stream) | 1文字読み取る(int 型で返すので EOF と比較できる) |
getc(stream) | fgetc とほぼ同じ |
ungetc(c, stream) | 読み取った1文字を入力ストリームに戻す(次回の入力で再び取得される) |
fputc(c, stream) | 1文字書き込む |
putc(c, stream) | fputc とほぼ同じ |
文字列・行単位の入出力
| 関数 | 説明 |
fgets(s, size, stream) | 1行(文字列)を読み取る。最大 size-1 文字+'¥0' |
gets(s) | 1行読み取る(非推奨・サイズ指定がなく安全性に問題あり) |
fputs(s, stream) | 文字列を書き込む |
puts(s) | 文字列を出力し、末尾に改行を付ける |
書式付き入出力
| 関数 | 説明 |
fscanf(stream, format, ...) | ファイルから書式付きで読み取る |
fprintf(stream, format, ...) | ファイルへ書式付きで出力する |
sscanf(s, format, ...) | 文字列から書式付きで読み取る(s=string) |
sprintf(s, format, ...) | 文字列へ書式付きで出力する(s=string) |
✅ 3つの「終わり・空」を区別:EOF=ファイル(入力)の終わり(整数 -1)/ NULL=どこも指さないポインタ(fopen 失敗の戻り値)/ '¥0'(ヌル文字)=文字列の終わり。試験で混同を狙われる定番ポイント。
💡 先頭の f は file/stream 版、s は string 版と読むと整理しやすい。printf→画面、fprintf→ファイル、sprintf→文字列。scanf 系も同様。
07-3 一般ユーティリティ関数(stdlib.h)
文字列→数値の変換、乱数、整数の絶対値などの汎用関数。
| 関数 | 説明 |
NULL | 何も指していないことを表す定数ポインタ(ヌルポインタ) |
atof(nptr) | 文字列を double に変換(a to f=ASCII to float) |
atoi(nptr) | 文字列を int に変換(a to i=ASCII to integer) |
atol(nptr) | 文字列を long に変換(a to l=ASCII to long) |
rand(void) | 乱数を生成する(0 〜 RAND_MAX) |
srand(unsigned seed) | 乱数の種(seed)を設定して初期化する |
abs(X) | X の絶対値を返す(int 型) |
labs(X) | X の絶対値を返す(long 型) |
✅ atoi("123") は文字列 "123" を整数 123 に変換する。「文字の '1''2''3'」と「数値の 123」は別物で、計算に使うには変換が必要。
✅ 絶対値は型で使い分け:整数なら abs(int)/ labs(long)、浮動小数点なら fabs(math.h・double)。
⚠ 配列の要素数を求めるのは関数ではなく演算子 sizeof:sizeof(配列) / sizeof(配列[0])。sizeof は stdlib.h の関数ではなく、言語が持つ演算子(#include 不要)である点に注意。
07-4 文字列操作関数(string.h)
文字列(char 配列)のコピー・連結・比較・検索・長さを扱う。詳しくは 01 文字列操作 の章も参照。
| 関数 | 説明 | 語源 |
NULL | 何も指していないことを表す定数ポインタ(ヌルポインタ) | — |
size_t | 配列サイズ・長さなどを表す型(定義は stddef.h) | — |
strcpy(dest, src) | src を dest へコピーする | str=string、cpy=copy |
strncpy(dest, src, n) | src から最大 n 文字だけ dest へコピーする | n=number(文字数) |
strcat(dest, src) | src を dest の末尾へ連結する | cat=catenate(連結) |
strncat(dest, src, n) | src から最大 n 文字だけ末尾へ連結する | n=number |
strcmp(s1, s2) | 2つの文字列を比較する。等しいと 0、s1>s2 なら正、s1<s2 なら負を返す | cmp=compare(比較) |
strncmp(s1, s2, n) | 先頭 n 文字だけ比較する | n=number |
strchr(s, c) | s の中で文字 c が最初に現れる位置のアドレスを返す | chr=character(文字) |
strrchr(s, c) | s の中で文字 c が最後に現れる位置のアドレスを返す | r=reverse(後ろから) |
strstr(s1, s2) | s1 の中に s2 が含まれる位置のアドレスを返す | str in str(文字列内検索) |
strlen(s) | 文字列の長さを返す('¥0' は含まない) | len=length(長さ) |
✅ strcmp は等しいと 0(0 以外=違う、と覚える)。if (strcmp(a, b) == 0) で「同じ文字列か」を判定する。
✅ strlen("Hello") は 5。終端文字 '¥0' を数えないので、配列サイズ(6)とは1だけ違う。
✅ 名前の n 付き(strncpy/strncat/strncmp)は文字数 n を指定する版。r 付き(strrchr)は後ろから探す版。
07-5 使用例(C89スタイル)
変数宣言は関数の先頭でまとめて行う(C89)。下は各ヘッダの関数を1つずつ使った例。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
int main(void)
{
char msg[20]; /* 変数はすべて先頭でまとめて宣言(C89) */
int len;
int n;
double r;
strcpy(msg, "Hello"); /* "Hello" をコピー */
len = strlen(msg); /* 5('¥0' は数えない) */
n = atoi("123"); /* 文字列 "123" → 整数 123 */
r = sqrt(16.0); /* 平方根 → 4.0 */
printf("msg=%s len=%d¥n", msg, len);
printf("n=%d sqrt(16)=%f¥n", n, r);
return 0;
}
実行結果:
msg=Hello len=5
n=123 sqrt(16)=4.000000
07-6 まとめ
- math.h:
sin/cos/tan/exp/log/pow/sqrt/ceil/floor/fabs。fabs は double。
- stdio.h:
fopen/fclose、fgetc/fputc、fgets/fputs/puts、fprintf/sprintf など。fopen 失敗は NULL。
- stdlib.h:
atof/atoi/atol(文字列→数値)、rand/srand、abs/labs。
- string.h:
strcpy/strcat/strcmp/strchr/strstr/strlen ほか。strcmp は等しいと 0、strlen は '¥0' を数えない。
- 3つの「終わり・空」:
EOF=ファイル終端 / NULL=空ポインタ / '¥0'=文字列終端。