標準Cライブラリ

**標準Cライブラリ**（ひょうじゅんシーライブラリ）は、C言語の標準規格で定められた、型・マクロ・関数の集合からなるライブラリである。

## 歴史
C言語は、PascalやPL/1等の従来のプログラミング言語とは異なり、文字列操作や入出力等の基本的な機能を内蔵していなかった。やがてC言語の利用者は、現在の標準Cライブラリの原型となる概念や実装を共有するようになった。

C言語の普及に伴い、言語仕様がそうであったように、ライブラリもまた多くの方言が生まれたが、1989年（ISO/IEC 9899:1990）にANSIによるC言語の標準規格が制定されることで統一化が図られ、更にはいくつかの新たな概念が導入され、これが標準Cライブラリとなった。

その後に行われた標準規格の改定は、標準Cライブラリへの機能追加が主であった。1995年（ISO/IEC 9899/AMD1:1995）には、主としてワイド文字操作に関する関数群が大幅に追加された。また、1999年（ISO/IEC 9899:1999、C99）には、主として複素数や数学上の演算に関する関数群が大幅に追加された。2011年（ISO/IEC 9899:2011、C11）には、アライメント・マルチスレッド・Unicode・メモリ境界チェック付き関数などが追加になった。

## 主な機能

### 標準ヘッダ
C11 (ISO/IEC 9899:2011) では、標準ヘッダとして以下のものを定めている。

### 診断機能 <code>assert.h</code>
ヘッダ `assert.h` がインクルードされる時点における `NDEBUG` マクロの定義状態により、実行時診断機能の有効・無効を切り替えることができる。
*`assert` &mdash; `NDEBUG` マクロが定義されていない場合に実行時診断を行う。
C11で、翻訳時に確定する式を対象にアサーションする `static_assert` が追加された。

### 複素数 <code>complex.h</code>
複素数の演算、虚数単位の定義、実部と虚部の分離機能などが含まれている。
* `complex` &mdash; 複素数型
* `I` &mdash; 虚数単位
* `cabs` &mdash; 絶対値
* `carg` &mdash; 偏角
* `cacos` &mdash; 逆余弦
* `cacosh` &mdash; 逆双曲線余弦
* `casin` &mdash; 逆正弦
* `casinh` &mdash; 逆双曲線正弦
* `catan` &mdash; 逆正接
* `catanh` &mdash; 逆双曲線正接
* `ccos` &mdash; 余弦
* `ccosh` &mdash; 双曲線余弦
* `cexp` &mdash; 指数関数
* `cfabs` &mdash; 浮動小数点数の絶対値
* `cimag` &mdash; 複素数の虚部
* `clog` &mdash; 自然対数
* `clog10` &mdash; 常用対数
* `conj` &mdash; 共役複素数
* `cpow` &mdash; 冪乗（べき乗、累乗）
* `cproj` &mdash; リーマン球への射影
* `creal` &mdash; 複素数の実部
* `csin` &mdash; 正弦
* `csinh` &mdash; 双曲線正弦
* `csqrt` &mdash; 平方根
* `ctan` &mdash; 正接
* `ctanh` &mdash; 双曲線正接

### 文字操作 <code>ctype.h</code>
文字種別の分類、および大文字・小文字の変換を行う関数を提供する。
`ctype.h` ヘッダが提供する文字操作関数は、設定されているロケールに応じて動作が変わる。
* `isalnum` &mdash; 英数字かどうかの判別
* `isalpha` &mdash; 英字かどうかの判別
* `isblank` &mdash; 単語を区切る文字かどうかの判定
* `iscntrl` &mdash; 制御文字かどうかの判別
* `isdigit` &mdash; 数字かどうかの判別
* `isgraph` &mdash; 空白（' '）を除く表示文字かどうかの判別
* `islower` &mdash; 小文字かどうかの判別
* `isprint` &mdash; 表示文字かどうかの判別
* `ispunct` &mdash; 区切り文字かどうかの判別
* `isspace` &mdash; 空白類文字かどうかの判別
* `isupper` &mdash; 大文字かどうかの判別
* `isxdigit` &mdash; 16進数字かどうかの判別
* `tolower` &mdash; 小文字への変換
* `toupper` &mdash; 大文字への変換

### エラー <code>errno.h</code>
ライブラリ関数内でエラーが発生した場合、そのエラーの内容を報告するために使用するいくつかのマクロ定義。
* `errno` &mdash; エラー番号を格納する`int`型の変数を参照するマクロ。マクロであるが、見かけ上は`int`型の変更可能な左辺値式に展開される（例えば`(*get_errno_address())`のような左辺値式に展開されるかもしれない）。C11以降でスレッドが標準化されたことに伴い、スレッドローカルな記憶域期間 (thread local storage duration) を持つことが規定された。
* `EDOM` &mdash; 定義域エラー
* `ERANGE` &mdash; 範囲エラー
* `EILSEQ` &mdash; 多バイト文字の不正な並び

### 浮動小数点型の特性 <code>float.h</code>
浮動小数点型の大きさや様々な特性を表すマクロの定義。
* `FLT_RADIX` &mdash; 浮動小数点型の内部表現に使用される基数
* `FLT_ROUNDS` &mdash; 浮動小数点型の丸め方向
* `FLT_MANT_DIG` &mdash; `float`型の`FLT_RADIX`を基数とした仮数部の桁数
* `FLT_MAX_EXP` &mdash; `float` 型における`FLT_RADIX`を基数とした指数部の最大値
* `FLT_MIN_EXP` &mdash; `float` 型における`FLT_RADIX`を基数とした指数部の最小値
* `FLT_MAX_10_EXP` &mdash; `float` 型における`10`を基数とした指数部の最大値
* `FLT_MIN_10_EXP` &mdash; `float` 型における`10`を基数とした指数部の最小値
* `FLT_MAX` &mdash; `float` 型の最大値
* `FLT_MIN` &mdash; `float` 型の正の値の最小値（整数型とは違い`float`型の実数の最小値は`-FLT_MAX`である）
* `FLT_EPSILON` &mdash; `float`型で表現可能な1より大きい最小値と`1`との差（計算機イプシロン）
* `DBL_MANT_DIG` &mdash; `double` 型の`FLT_RADIX`を基数とした仮数部の桁数
* `DBL_MAX_EXP` &mdash; `double` 型における`FLT_RADIX`を基数とした指数部の最大値
* `DBL_MIN_EXP` &mdash; `double`型における`FLT_RADIX`を基数とした指数部の最小値
* `DBL_MAX_10_EXP` &mdash; `double`型における`10`を基数とした指数部の最大値
*`DBL_MIN_10_EXP` &mdash; `double` 型における`10`を基数とした指数部の最小値
*`DBL_MAX` &mdash; `double`型の最大値
*`DBL_MIN` &mdash; `double`型の正の値の最小値（整数型とは違い`double`型の実数の最小値は`-DBL_MAX`である）
*`DBL_EPSILON` &mdash; `double` 型で表現可能な1より大きい最小値と`1`との差
*`LDBL_MANT_DIG` &mdash; `long double` 型の `FLT_RADIX` を基数とした仮数部の桁数
*`LDBL_MAX_EXP` &mdash; `long double` 型における `FLT_RADIX` を基数とした指数部の最大値
*`LDBL_MIN_EXP` &mdash; `long double` 型における `FLT_RADIX` を基数とした指数部の最小値
*`LDBL_MAX_10_EXP` &mdash; `long double` 型における`10`を基数とした指数部の最大値
*`LDBL_MIN_10_EXP` &mdash; `long double` 型における`10`を基数とした指数部の最小値
*`LDBL_MAX` &mdash; `long double` 型の最大値
*`LDBL_MIN` &mdash; `long double` 型の最小値
*`LDBL_EPSILON` &mdash; `long double` 型で表現可能な1より大きい最小値と`1`との差

### 整数型の大きさ <code>limits.h</code>
整数型の大きさを表すマクロの定義。
*`CHAR_BIT` &mdash; `char`型を構成する1バイトのビット数（`&gt;=8`）
*`MB_LEN_MAX` &mdash; 処理系がサポートするマルチバイト文字の最大バイト数
*`CHAR_MAX` &mdash; `char`型の最大値。`SCHAR_MAX` または `UCHAR_MAX` と同じ
*`CHAR_MIN` &mdash; `char`型の最小値。`SCHAR_MIN` または `0` と同じ
*`SCHAR_MAX` &mdash; `signed char` 型の最大値（`&gt;=127`）
*`SCHAR_MIN` &mdash; `signed char` 型の最小値（`&lt;=-127`）
*`UCHAR_MAX` &mdash; `unsigned char` 型の最大値（`&gt;=255`）
*`SHRT_MAX` &mdash; `short`型の最大値（`&gt;=32767`）
*`SHRT_MIN` &mdash; `short`型の最小値（`&lt;=-32767`）
*`USHRT_MAX` &mdash; `unsigned short`型の最大値（`&gt;=65535`）
*`INT_MAX` &mdash; `int`型の最大値（`&gt;=32767`）
*`INT_MIN` &mdash; `int`型の最小値（`&lt;=-32767`）
*`UINT_MAX` &mdash; `unsigned int`型の最大値（`&gt;=65535`）
*`LONG_MAX` &mdash; `long`型の最大値（`&gt;=2147483647`）
*`LONG_MIN` &mdash; `long`型の最小値（`&lt;=-2147483647`）
*`ULONG_MAX` &mdash; `unsigned long`型の最大値（`&gt;=4294967295`）

### 文化圏固有操作 <code>locale.h</code>
ロケールごとに異なる、文字コード、数値を記述する場合の書式等の操作を行う型・マクロ・関数の宣言定義。
*`struct lconv` &mdash; 数値を記述する場合の書式に関する情報を格納する構造体
*`localeconv` &mdash; 設定されているロケールに応じた値を格納した `struct lconv`を参照
*`setlocale` &mdash; 現在のロケールを設定

### 数学 <code>math.h</code>
数学的な演算を行うための関数、および関連するマクロの宣言定義。
*`HUGE_VAL` &mdash; `float`型で表現できるとは限らない正の`double`型の式。無限大またはそれに類する大きな値
*`acos` &mdash; 逆余弦
*`asin` &mdash; 逆正弦
*`atan` &mdash; 逆正接
*`atan2` &mdash; 底辺と高さを指定した直角三角形の逆正接
*`ceil` &mdash; 天井関数
*`cos` &mdash; 余弦
*`cosh` &mdash; 双曲線余弦
*`exp` &mdash; 指数関数
*`fabs` &mdash; 浮動小数点数の絶対値
*`floor` &mdash; 床関数
*`fmod` &mdash; 浮動小数点どうしの商と剰余
*`frexp` &mdash; 「正規化された仮数部」と「`2`の累乗」への分解
*`ldexp` &mdash; 浮動小数点数と2の累乗との乗算
*`log` &mdash; 自然対数
*`log10` &mdash; 常用対数
*`modf` &mdash; 整数部と小数部の分解
*`pow` &mdash; 冪乗（べき乗、累乗）
*`sin` &mdash; 正弦
*`sinh` &mdash; 双曲線正弦
*`sqrt` &mdash; 平方根
*`tan` &mdash; 三角関数|正接
*`tanh` &mdash; 双曲線関数|双曲線正接

### 非局所分岐 <code>setjmp.h</code>
関数の枠組みを越えた分岐（ジャンプ）を制御するための型・マクロ・関数の宣言定義。
*`jmp_buf` &mdash; `setjmp` マクロが実行環境を保存するための型
*`setjmp` &mdash; `longjmp` 関数による復帰を可能にするために実行環境を保存するためのマクロ（しばしば直接、関数で実装されているが、標準ではマクロとされている。POSIXではマクロか関数かは指定されない、としている）
*`longjmp` &mdash; `setjmp` マクロで保存された環境への復帰

### シグナル操作 <code>signal.h</code>
シグナル処理関数の登録およびシグナルの送信に関するマクロ・型・関数の宣言定義。
*`sig_atomic_t` &mdash; 代入および参照が不分割に実行される（アトミックオペレーションとなる）整数型
*`raise` &mdash; シグナルの送信
*`signal` &mdash; シグナル処理関数の登録

### 可変個数の引数 <code>stdarg.h</code>
printf 関数のような可変長引数の関数における実引数の操作に関する型とマクロの定義。
*`va_list` &mdash; 可変個の実引数にアクセスするための情報を格納する型
*`va_arg` &mdash; 可変個の実引数の取り出し
*`va_start` &mdash; 可変個の実引数操作の開始
*`va_end` &mdash; 可変個の実引数操作の終了

### 共通の定義 <code>stddef.h</code>
処理系に依存する型とマクロの定義。
*`ptrdiff_t` &mdash; ポインタ減算の結果の型。符号付き整数型。
*`size_t` &mdash; sizeof 演算子の結果の型。符号無し整数型。Unix 系など、POSIX 1003.1-1996 API に準拠している場合、`ssize_t`が符号付きの`size_t`。
*`wchar_t` &mdash; ワイド文字型。8ビット以上の整数だが、コンパイラやプラットフォームにより大きさは様々。Microsoft Windowsでは16ビット、Unix系では32ビットであることが多い。
*`[[Null|NULL]]` &mdash; 空ポインタ定数マクロ
*`offsetof` &mdash; 構造体メンバの先頭からのオフセットを得る

### 入出力 <code>stdio.h</code>
ストリームおよびファイルの操作に関する型・マクロ・関数の宣言定義。
*`FILE` &mdash; ストリームを制御するためのオブジェクト型（構造体とは限らない）
*`fpos_t` &mdash; ファイルのシーク位置を格納するための型
*`clearerr` &mdash; ファイル終端表示子およびエラー表示子のクリア
*`fclose` &mdash; ファイルのクローズ
*`feof` &mdash; ファイル終端表示子の判定
*`ferror` &mdash; エラー表示子の判定
*`[[fgetc]]` &mdash; ストリームからの1文字入力
*`fgetpos` &mdash; ストリームのファイル位置表示子の参照
*`[[fgets]]` &mdash; ストリームからの1行入力
*`fopen` &mdash; ファイルのオープン
*`fprintf` &mdash; ストリームへの書式付き出力
*`[[fputc]]` &mdash; ストリームへの1文字出力
*`fputs` &mdash; ストリームへの1行出力
*`[[fread]]` &mdash; ストリームからの読み込み
*`fscanf` &mdash; ストリームからの書式付き入力
*`fseek` &mdash; ストリームのファイル位置表示子の変更
*`fsetpos` &mdash; ストリームのファイル位置表示子の設定
*`ftell` &mdash; ストリームのファイル位置表示子の参照
*`[[fwrite]]` &mdash; ストリームへの書き込み
*`[[getc]]` &mdash; ストリームからの1文字入力
*`getchar` &mdash; 標準入力からの1文字入力
*`[[gets]]` &mdash; 標準入力からの1行入力（ただし、C11で削除された）
*`perror` &mdash; 標準エラー出力へのエラーメッセージの出力
*`[[printf]]` &mdash; 標準出力への書式付き出力
*`[[putc]]` &mdash; ストリームへの1文字出力
*`putchar` &mdash; 標準出力への1文字出力
*`puts` &mdash; 標準出力への1行出力
*`remove` &mdash; ファイルの削除
*`rename` &mdash; ファイル名の変更
*`rewind` &mdash; ストリームの巻き戻し
*`[[scanf]]` &mdash; 標準入力からの書式付き入力
*`setbuf` &mdash; ストリームのバッファ設定
*`setvbuf` &mdash; ストリームの詳細なバッファ設定
*`sprintf` &mdash; 文字配列への書式付き出力
*`sscanf` &mdash; 文字列からの書式付き入力
*`tmpfile` &mdash; テンポラリファイルをバイナリモードでオープン
*`tmpnam` &mdash; テンポラリファイル名の生成
*`vprintf` &mdash; 標準出力への書式付き出力（`va_list`版）
*`vscanf` &mdash; 標準入力からの書式付き入力（`va_list`版）

### 一般ユーティリティ <code>stdlib.h</code>
一般ユーティリティに関する型・マクロ・関数の宣言定義。
*`[[div_t]]` &mdash; `int`型の商と剰余を格納する構造体
*`[[div_t#ldiv_t|ldiv_t]]` &mdash; `long`型の商と剰余を格納する構造体
*`MB_CUR_MAX` &mdash; 設定されているロケールにおけるマルチバイト文字の最大バイト数を表すマクロ
*`RAND_MAX` &mdash; `rand`関数が返す擬似乱数の最大値
*`[[abort]]` &mdash; プログラムの異常終了
*`[[abs]]` &mdash; `int`型の絶対値
*`aligned_alloc` &mdash; アライメントされたメモリブロックの割り付け（C11で追加）
*`atexit` &mdash; 終了時関数の登録
*`at_quick_exit` &mdash; 通常の終了時関数の登録（C11で追加）
*`[[atof]]` &mdash; 文字列から`double`型への変換
*`[[atoi]]` &mdash; 文字列から`int`型への変換
*`[[atol]]` &mdash; 文字列から`long`型への変換
*`bsearch` &mdash; バイナリサーチ
*`[[calloc]]` &mdash; メモリブロックの割り付けとクリア
*`[[div]]` &mdash; `int`型どうしの商と剰余
*`[[Exit (システムコール)|exit]]` &mdash; プログラムの終了
*`free` &mdash; メモリブロックの解放
*`getenv` &mdash; 環境変数の参照
*`labs` &mdash; `long`型の絶対値
*`ldiv` &mdash; `long`型どうしの商と剰余
*`[[malloc]]` &mdash; メモリブロックの割り付け
*`mblen` &mdash; マルチバイト文字の構成バイト数
*`mbstowcs` &mdash; マルチバイト文字列からワイド文字列への変換
*`mbtowc` &mdash; マルチバイト文字からワイド文字への変換
*`qsort` &mdash; クイックソート (ただし、仕様上はソートを行うとあるだけで「クイックソートによる」とは書かれていない)
*`quick_exit` &mdash; 通常のプログラムの終了（C11で追加）
*`[[rand]]` &mdash; 擬似乱数
*`realloc` &mdash; メモリブロックの再割り付け
*`[[srand]]` &mdash; 乱数種の設定
*`[[strtod]]` &mdash; 文字列から`double`型への変換
*`strtol` &mdash; 文字列から`long`型への変換（基数指定可）
*`[[strtoul]]` &mdash; 文字列から`unsigned long`型への変換（基数指定可）
*`[[system]]` &mdash; コマンドプロセッサの呼び出し
*`wcstombs` &mdash; ワイド文字列からマルチバイト文字列への変換
*`wctomb` &mdash; ワイド文字列からマルチバイト文字列への変換

### 文字列操作 <code>string.h</code>
文字列操作に関する型・マクロ・関数の宣言定義。
*`memchr` &mdash; メモリブロック中の文字検索
*`memcmp` &mdash; メモリブロックの比較
*`memcpy` &mdash; メモリブロックのコピー
*`memmove` &mdash; メモリブロックの転送
*`[[memset]]` &mdash; メモリブロックを指定文字で埋める
*`strchr` &mdash; 文字列内の文字探索
*`[[strcat]]` &mdash; 文字列の連結
*`[[strcmp]]` &mdash; 文字列の比較
*`[[strcpy]]` &mdash; 文字列のコピー
*`strcspn` &mdash; 文字列中の指定文字群を含まない先頭部分の長さ
*`strerror` &mdash; エラー番号に対応したエラーメッセージ文字列の取得
*`strcoll` &mdash; ロケールに応じた順序付けによる文字列の比較
*`[[strlen]]` &mdash; 文字列の長さ
*`strncat` &mdash; 字数制限付きで文字列の連結
*`strncmp` &mdash; 字数制限付きで文字列の比較
*`strncpy` &mdash; 字数制限付きで文字列のコピー
*`strpbrk` &mdash; 文字列中の文字群探索
*`strrchr` &mdash; 文字列内の逆方向文字探索
*`strspn` &mdash; 文字列中の指定文字群を含む先頭部分の長さ
*`strstr` &mdash; 文字列中の文字列探索
*`strtok` &mdash; 文字列からの字句切り出し
*`strxfrm` &mdash; ロケールに応じた順序付けになるように文字列を変換

### 型総称数学関数<tgmath.h>

### スレッド<threads.h>

C11で追加。

### 日付及び時間 <code>time.h</code>
グレゴリオ暦に基づく日付等を扱うための型・マクロ・関数の宣言定義。
*`clock_t` &mdash; clock 関数が返す値の型
*`[[time_t]]` &mdash; 時刻を表す型
*`struct tm` &mdash; 暦時刻の各要素（年月日時分秒等）を格納する構造体
*`CLOCKS_PER_SEC` &mdash; `clock`関数が返す値を秒単位に変換するための除数を表すマクロ定数
*`asctime` &mdash; `tm`構造体から文字列への変換
*`clock` &mdash; 処理系定義の開始点（通例プログラム実行開始）からの経過時間（プロセッサ時間、CPU使用時間）の取得
*`ctime` &mdash; `time_t`型から文字列への変換
*`difftime` &mdash; `time_t`型どうしの秒単位での差
*`gmtime` &mdash; 協定世界時 (UTC) の取得
*`localtime` &mdash; 地方時刻の取得
*`mktime` &mdash; `tm`構造体から `time_t`型への変換
*`strftime` &mdash; `tm`構造体から文字列への書式付き変換
*`time` &mdash; 現在の暦時刻 (calendar time) の取得
time_tは、特にUNIX用の実装を初めとした多くの実装において、協定世界時 (UTC) 1970年1月1日0時0分0秒からの経過秒数を符号付32ビット整数型で表すようになっている。そのような実装では2001年9月9日問題、2038年問題のような問題が生じる。詳しくは各問題の記事を参照されたい。

### Unicodeユーティリティ<uchar.h>

C11で追加。

### 多バイト文字及びワイド文字拡張ユーティリティ<wchar.h>

### ワイド文字種分類及びワイド文字大文字小文字ユーティリティ<wctype.h>

## フリースタンディング環境
フリースタンディング環境では、C89 では標準Cライブラリのうち `float.h`、`limits.h`、`stdarg.h`、`stddef.h` に対応している。ISO/IEC 9899/AMD1:1995 では加えて `[[iso646.h]]` が、C99 では更に `stdbool.h` および `stdint.h` に対応している。

## Unix系の標準Cライブラリ
Unix系に関係するPOSIX、SUS、Linux Standard Baseなどの標準仕様では、標準Cライブラリを包含し、さらに追加の関数やマクロ、型などが規定されている。

GNU/Linux（多くのLinuxディストリビューション）では、一般的にGNU Cライブラリ (glibc) が標準Cライブラリの実装として用いられている。BSD系列での実装は、BSD libcと呼称される。

## C++における標準Cライブラリ
C++03の標準C++ライブラリでは、C95相当の標準Cライブラリを包含している。更には、C95では任意実装であった`float`型や`double`型の数学関数も常にサポートされる。C++11ではC99相当の標準Cライブラリと `uchar.h` を包含している。

標準Cライブラリにおけるヘッダ `<var>xyz</var>.h` は、C++では `c<var>xyz</var>` というヘッダにマッピングされる。各識別子は `std` 名前空間内で宣言される。また、標準Cライブラリとの互換性を持たせるため、`<var>xyz</var>.h` 形式のヘッダも使用することができ、`std` 名前空間内で宣言された識別子は`using`指令によってグローバル名前空間に引き出される。

C++固有の事情から、一部の関数についてはC言語との互換性が低下している。具体的には`memchr`関数や`strstr`関数等がそれにあたる。すなわち、引数として渡されるポインタが指す型が`const`修飾されているか否かにより、返却値の型もそれに合わせて変更されるように多重定義されている。

Cの場合

```c
char *strchr(const char*, int);
```

C++の場合

```cpp
const char *strchr(const char*, int);
char *strchr(char*, int);
```


## 脚註


## 外部リンク