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(後ろから)など。各表のかっこ内に語源を記載した。
数値計算を行う関数群。引数・戻り値は基本的に 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。
画面・キーボード・ファイルとの入出力を行う。まず覚えるべき用語・定数から。
| 用語/定数 | 説明 |
|---|---|
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) |
EOF=ファイル(入力)の終わり(整数 -1)/ NULL=どこも指さないポインタ(fopen 失敗の戻り値)/ '¥0'(ヌル文字)=文字列の終わり。試験で混同を狙われる定番ポイント。
f は file/stream 版、s は string 版と読むと整理しやすい。printf→画面、fprintf→ファイル、sprintf→文字列。scanf 系も同様。
文字列→数値の変換、乱数、整数の絶対値などの汎用関数。
| 関数 | 説明 |
|---|---|
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 不要)である点に注意。
文字列(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)は後ろから探す版。
変数宣言は関数の先頭でまとめて行う(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
sin/cos/tan/exp/log/pow/sqrt/ceil/floor/fabs。fabs は double。fopen/fclose、fgetc/fputc、fgets/fputs/puts、fprintf/sprintf など。fopen 失敗は NULL。atof/atoi/atol(文字列→数値)、rand/srand、abs/labs。strcpy/strcat/strcmp/strchr/strstr/strlen ほか。strcmp は等しいと 0、strlen は '¥0' を数えない。EOF=ファイル終端 / NULL=空ポインタ / '¥0'=文字列終端。Q1. sqrt や pow が宣言されているヘッダファイルはどれか。
正解:ウ(<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)
fabs の f は 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])。sizeof は stdlib.h の関数ではなく演算子(#include 不要)。strlen は文字列専用で整数配列には使えない。
Q8. 「ファイルの終わり」「空ポインタ」「文字列の終わり」を表すものの組み合わせとして正しいものはどれか。
正解:ア
EOF=ファイル(入力)の終端(整数 -1)/ NULL=どこも指さないポインタ(fopen 失敗時の戻り値)/ '¥0'(ヌル文字)=文字列の終端。3つは役割が違うので混同しないこと。