07 標準ライブラリ関数まとめ(math / stdio / stdlib / string)

C言語の標準ライブラリには、数学計算・入出力・変換・文字列操作などの便利な関数が用意されている。2級では「どの関数がどのヘッダに属するか」「戻り値の型と意味」がよく問われる。ここでは試験範囲の4つのヘッダ(<math.h> / <stdio.h> / <stdlib.h> / <string.h>)の主な関数を表にまとめる。

✅ この章のゴール:① 主要関数が属するヘッダを言える(例:sqrt/powmath.h)② 戻り値の型と意味が分かる(例:fabsdoublestrcmp→等しいと0)③ EOFNULL'¥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(浮動小数点)
fabsffloating-point(浮動小数点)の意味で、扱うのは float ではなく double。「f だから float」と早合点しないこと。整数の絶対値は absstdlib.h)を使う。
ceil(天井=切り上げ↑)と floor(床=切り捨て↓)の向きを取り違えやすい。例:ceil(2.1)=3.0floor(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'(ヌル文字)=文字列の終わり。試験で混同を狙われる定番ポイント。
💡 先頭の ffile/stream 版sstring 版と読むと整理しやすい。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)、浮動小数点なら fabsmath.h・double)。
配列の要素数を求めるのは関数ではなく演算子 sizeofsizeof(配列) / sizeof(配列[0])sizeofstdlib.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 まとめ


07-7 理解度チェック

Q1. sqrtpow が宣言されているヘッダファイルはどれか。

解説を表示

正解:ウ(<math.h>)

sqrt(平方根)・pow(累乗)をはじめ sin/cos/log/fabs などの数学関数は <math.h> に宣言されている。

Q2. strlen("Hello") の戻り値はどれか(終端文字を数えるか)。

解説を表示

正解:ア(5)

strlen は文字列の長さを返すが、終端文字 '¥0'数えない。"Hello" は5文字なので 5。配列サイズ('¥0' 込みで 6)とは区別する。

Q3. atoi("123") の役割として正しいものはどれか。

解説を表示

正解:イ

atoi(ASCII to integer)は文字列を int に変換する。double へ変換するのは atof、long へ変換するのは atol。いずれも <stdlib.h>

Q4. fabs(x) の戻り値の型はどれか。

解説を表示

正解:エ(double)

fabsf は floating-point(浮動小数点)の意味で、扱うのは double(float ではない)。整数の絶対値は abs(int)/ labs(long)。

Q5. 2つの文字列が等しいとき、strcmp(s1, s2) が返す値はどれか。

解説を表示

正解:ア(0)

strcmp は等しいと 0、s1 が大きいと正、s1 が小さいと負を返す。「等しい=0」「0以外=違う」と覚える。

Q6. pow(x, y) が返す値はどれか。

解説を表示

正解:ウ(x の y 乗)

pow=power(累乗)。pow(2, 10) は 2 の10乗で 1024.0。平方根は sqrt。いずれも <math.h>、戻り値は double

Q7. 配列 int a[10]; の要素数を求める式として正しいものはどれか。

解説を表示

正解:イ

要素数は 配列全体のバイト数 ÷ 1要素のバイト数sizeof(a) / sizeof(a[0])sizeofstdlib.h の関数ではなく演算子#include 不要)。strlen は文字列専用で整数配列には使えない。

Q8. 「ファイルの終わり」「空ポインタ」「文字列の終わり」を表すものの組み合わせとして正しいものはどれか。

解説を表示

正解:ア

EOF=ファイル(入力)の終端(整数 -1)/ NULL=どこも指さないポインタ(fopen 失敗時の戻り値)/ '¥0'(ヌル文字)=文字列の終端。3つは役割が違うので混同しないこと。