[C言語 標準ライブラリ] stdlib.hの使い方

スポンサーリンク

stdlib.hは一般的な実用性を持つマクロ、型、関数が宣言および定義されています。

  1. マクロ
    1. NULL
    2. EXIT_FAILURE
    3. EXIT_SUCCESS
    4. RAND_MAX
    5. MB_CUR_MAX
    1. size_t
    2. wchar_t
    3. div_t
    4. ldiv_t
    5. lldiv_t
  2. 数値変換関数
    1. double atof(const char *nptr)
    2. int atoi(const char *nptr)
    3. long atol(const char *nptr)
    4. long long int atoll(const char *nptr)
    5. double strtod(const char *nptr, char **endptr)
    6. float strtof(const char *nptr, char **endptr)
    7. long double strtold(const char *nptr, char **endptr)
    8. long int strtol(const char *nptr, char **endptr, int base)
    9. unsigned long strtoul(const char *nptr, char **endptr, int base)
    10. long long strtoll(const char *nptr, char **endptr, int base)
    11. unsigned long long strtoull(const char *nptr, char **endptr, int base)
  3. 擬似乱数列生成関数
    1. int rand(void)
    2. void srand(unsigned int seed)
  4. 記憶域管理関数
    1. void *calloc(size_t nmemb, size_t size)
    2. void free(void *ptr)
    3. void *malloc(size_t size)
    4. void *realloc(void *ptr, size_t size)
  5. 環境に関連する関数
    1. void abort(void)
    2. int atexit(void (*func)(void))
    3. void exit(int status)
    4. void _Exit(int status)
    5. char *getenv(const char *name)
    6. int system(const char *string)
  6. 探索・整列ユーティリティ関数
    1. char *bsearch(const void *key, const void base, size_t nmemb, size_t size, int (compar)(const void *, const void *))
    2. char *qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))
  7. 整数算術関数
    1. int abs(int j)
    2. div_t div(int numer, int denom)
    3. long int labs(long int j)
    4. ldiv_t ldiv(long int numer, long int denom)
    5. long int llabs(long long int j)
    6. lldiv_t lldiv(long long int numer, long long int denom)
  8. マルチバイト文字・ワイド文字変換関数
    1. int mblen(const char *s, size_t n)
    2. int mbtowc(wchar_t *pwc, const char *s, size_t n)
    3. int wctomb(char *s, wchar_t wchar)
  9. マルチバイト文字列・ワイド文字列変換関数
    1. size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n)
    2. size_t wcstombs(char *s, const wchar_t *pwcs, size_t n)
スポンサーリンク

マクロ

NULL

空(NULL)ポインタ定数です。
stddef.h、locale.h、stdio.h、stdlib.h、string.h、time.h、wchar.hで定義されています。

EXIT_FAILURE

失敗終了状態であることを示します。
exit関数の実引数として使用します。

EXIT_SUCCESS

成功終了状態であることを示します。
exit関数の実引数として使用します。

RAND_MAX

rand関数が返す最大値を示します。

MB_CUR_MAX

その時のロケール(LC_CTYPEカテゴリ)の拡張文字集合におけるマルチバイト文字の最大バイト数を表す正の整数式に展開されるオブジェクト形式のマクロです。
この値がMB_LEN_MAXを超えることはありません。

size_t

sizeof演算子が生成する結果を表すための符号無し整数型です。
stddef.h、stdio.h、stdlib.h、string.h、time.h、wchar.hで定義されます。

wchar_t

処理系がサポートするロケールの中で最も大きな拡張文字集合のすべての要素に対して、区別可能なコードを表現できる値の範囲をもつ整数型です。
この型では、NULL文字はコード値0を持ちます。
stddef.h、stdlib.h、wchar.hで定義されます。

div_t

div関数が返す値を表す型です。
次のメンバを含む構造体です。

メンバ名説明
intquot商です。
intrem剰余です。

ldiv_t

ldiv関数が返す値を表す型です。
次のメンバを含む構造体です。

メンバ名説明
longquot商です。
longrem剰余です。

lldiv_t

lldiv関数が返す値を表す型です。
次のメンバを含む構造体です。

メンバ名説明
long longquot商です。
long longrem剰余です。

数値変換関数

double atof(const char *nptr)

引数nptrが指す文字列をdouble型フォーマットに変換します。
エラー時の動作を除けば、以下の関数と同等です。

strtod(nptr, (char **)NULL);

変換された値が返されます。

int atoi(const char *nptr)

引数nptrが指す文字列をint型フォーマットに変換します。
エラー時の動作を除けば、以下の関数と同等です。

(int)strtol(nptr, (char **)NULL, 10);

変換された値が返されます。

long atol(const char *nptr)

nptrが指す文字列をlong int型フォーマットに変換します。
エラー時の動作を除けば、以下の関数と同等です。

strtol(nptr, (char **)NULL, 10);

変換された値が返されます。

long long int atoll(const char *nptr)

trが指す文字列をlong long int型フォーマットに変換します。
エラー時の動作を除けば、以下の関数と同等です。

strtoll(nptr, (char **)NULL, 10)

変換された値が返されます。

double strtod(const char *nptr, char **endptr)

引数nptrが指す文字列をdouble型フォーマットに変換します。
まず、入力文字列が次の3つに分けられます。
・最初の省略可能な空白の連続
・変換の対象となる浮動小数点定数の形をした部分(この部分を以後「主体」と呼ぶ)
・最後にあるNULL文字を含む認識されない文字列。
次に、主体となる部分を浮動小数点数に変換し、結果が返されます。

変換可能な主体の形は次の通りです。
・省略可能な正か負の符号
・それに続く数字の連なり
・省略可能な指数部
前述の主体が取るべき形は、空白以外の文字で始まる入力内で最長の部分文字列として定義されます。
入力文字列の中身が無いとか、空白ばかりであるとか、最初の空白でない文字が符号や数字や小数点でない場合には、主体はありません。

主体が変換可能であれば、最初の数字か小数点から後は、以下の点を除いて浮動小数点定数と同じように解釈されます。すなわち、小数点はピリオドとして扱われ、小数点も指数部も無い場合には数字の最後の桁の後に小数点があるものとして扱われます。主体が負の符号で始まる場合、変換後の数値は負になります。
endptrがNULLでなければ、最後の文字列へのポインタがendptrが指すオブジェクトに格納されます。

“C”ロケール以外では処理系定義の主体の形が追加対応されていてもよい。

主体がない場合や変換可能でない場合は変換は行われず、endptrがNULLでなければ、nptrの値がendptrが指すオブジェクトに格納されます。

存在するならば変換された値が返されます。
変換できなかった場合は、0が返されます。
本来の数値が表現可能な範囲を超えていた場合は、正か負のHUGE_VALが返され、errnoにはERANGEが格納されます。
アンダーフローを起こした場合は、0が返され、errnoにはERANGEが格納されます。

float strtof(const char *nptr, char **endptr)

strtodのfloat版です。

long double strtold(const char *nptr, char **endptr)

strtodのlong double版です。

long int strtol(const char *nptr, char **endptr, int base)

引数nptrが指す文字列の最初の部分をlong int型フォーマットに変換します。
まず、入力文字列が次の3つに分けられます。
・最初の、省略可能な空白の連続
・変換の対象となるbaseによるある基数の整数定数の形をした部分(この部分を以後「主体」と呼ぶ)
・最後にあるNULL文字を含む認識されない文字列
次に、主体となる部分を整数に変換し、結果が返されます。

baseの値が0ならば、変換可能な主体の形は以下の点を除いた整数定数と同じです。
すなわち、省略可能な正か負の符号を持てるということと、整数接尾辞がないということです。
baseの値が2と36の間であれば、変換可能な主体の形は以下の点を満たすbaseを基数とする文字と数字の連続です。
すなわち、省略可能な正か負の符号を持てるということと、整数接尾辞がないということです。
a(またはA)からz(またはZ)までの文字は10から35までの数値を表します。
表す数字がbaseより小さい文字のみ許されます。
baseの値が16なら、0xまたは0Xの接頭辞が符号の後にについていてもよい。

前述の主体が取るべき形は、空白以外の文字で始まる入力内で最長の部分文字列として定義されます。
入力文字列の中身が無いとか、空白ばかりであるとか、最初の空白でない文字が符号や許される文字や数字でない場合には、主体はありません。

主体が変換可能でbaseの値が0ならば、最初の数字から後は整数定数と同じように解釈されます。
主体が変換可能でbaseの値が2と36の間であれば、これは変換の基数として使われ、各文字の値は前述した通りです。
主体が負の符号で始まる場合、変換後の数値は負になります。
endptrがNULLでなければ、最後の文字列へのポインタがendptrが指すオブジェクトに格納されます。

“C”ロケール以外では処理系定義の主体の形が追加対応されていてもよい。

主体がない場合や変換可能でない場合は変換は行われず、endptrがNULLでなければ、nptrの値がendptrが指すオブジェクトに格納されます。

存在するならば変換された値が返されます。
変換できなかった場合は、0が返されます。
本来の数値が表現可能な範囲を超えていた場合、LONG_MAXかLONG_MINが返され、errnoにはERANGEが格納されます。

unsigned long strtoul(const char *nptr, char **endptr, int base)

strtolのunsigned long版です。

long long strtoll(const char *nptr, char **endptr, int base)

strtolのlong long版です。

unsigned long long strtoull(const char *nptr, char **endptr, int base)

strtolのunsignd long long版です。

擬似乱数列生成関数

int rand(void)

0~RAND_MAXの間の連続擬似乱数を発生させます。
整数の擬似乱数が返されます。
(RAND_MAXマクロ値は32767以上です)

void srand(unsigned int seed)

seedをrand関数が返す新しい乱数列のシードとして使用します。
srandが同じシード値で呼ばれるならば、乱数列も同じものが繰り返されます。
srandよりもrandが先に呼ばれた場合、srandに1を渡したのと同じ乱数列が発生します。

記憶域管理関数

void *calloc(size_t nmemb, size_t size)

動的メモリを確保し、0クリアします。
nmemb個のsizeの大きさのオブジェクトの配列のための空間を確保します。
空間の全てのビットは0に初期化されます。
成功したときは確保された領域へのポインタが返され、失敗したときはNULLポインタが返されます。

void free(void *ptr)

確保された動的メモリ領域を開放します。
ptrが指す空間を確保されていない状態に戻します。
この領域は、以降の確保に使えるようになります。
ptrがNULLポインタである場合は何も起きません。
calloc、malloc、reallocのいずれの返り値でもなかった場合、 またはfreeかreallocによって領域が開放されていた場合の動作は未定義です。

void *malloc(size_t size)

動的メモリを確保します。
sizeの大きさのオブジェクトのための空間を確保します。
オブジェクトの値は不定です。
成功したときは確保された領域へのポインタが返され、失敗したときはNULLポインタが返されます。

void *realloc(void *ptr, size_t size)

動的メモリを再確保します。
ptrで指定されるオブジェクトのサイズをsizeに変更します。
変更前と後での小さいほうのサイズまでの内容は変化しません。
変更後のサイズのほうが大きかった場合、新たに確保された部分の内容は不定です。
ptrがNULLポインタであれば、この関数は引数にsizeを渡したmallocと同等です。
NULLポインタでなく、calloc、malloc、reallocのいずれの返り値でもないか、freeかreallocによって開放されていた場合の動作は未定義です。
確保できない場合、ptrの指すオブジェクトは変更されません。
sizeが0でptrがNULLポインタでない場合は、オブジェクトは開放されます。
成功したときは移動したかもしれない領域へのポインタが返され、失敗したときはNULLポインタが返されます。

環境に関連する関数

void abort(void)

プログラムの実行を中断します。
SIGABRTシグナルが捕らえられ、シグナルハンドラが返らない事態にならない限り、異常なプログラムの終了を引き起こします。
出力ストリームがフラッシュされるか、入力ストリームが閉じられるか、一時ファイルが削除されるかどうかは処理系定義です。
処理系定義の「非成功時の終了」状態がraise(SIGABRT)によって実行環境に返されます。
この関数は、呼び出し元に戻ることはありません。

int atexit(void (*func)(void))

funcが指す関数の終了時に、引数なしで呼び出されるように登録します。
登録に成功すれば0が返され、失敗すれば0以外が返されます。
処理系は少なくとも32個の関数を登録できなければなりません。

void exit(int status)

プログラムの正常終了を引き起こします。
2度以上exitが呼ばれた場合の動作は未定義です。
まず、全てのatexitによって登録された関数が、登録されたのとは逆の順番で実行されます。
次に、全ての書かれていないバッファにためられたデータをもつ開いたストリームはフラッシュされ、 全ての開いたストリームは閉じられ、tmpfileによって作られた一時ファイルは削除されます。
最後に、制御は実行環境に戻ります。
statusの値が0かEXIT_SUCCESSであれば、処理系定義の「成功時の終了」状態が返されます。
EXIT_FAILUREであれば、処理系定義の「非成功時の終了」状態が返されます。
他の場合の返される状態は処理系定義です。
この関数は、呼び出し元に戻ることはありません。

void _Exit(int status)

正常プログラム終了を引き起こして制御をホスト環境に戻します。
以下のものは呼び出されません。
・atexit関数で登録された関数
・at_quick_exitで登録された関数(C11)
・signal関数で登録されたシグナル処理ルーチン
ホスト環境に戻される状態の決定は、exit関数での決定と同じ方法で行われます。
オープンしている出カストリームがフラッシュされるか、オープンしているストリームがクローズされるか、一時ファイルが削除されるかどうかは処理系定義です。

char *getenv(const char *name)

実行環境によって提供される環境変数リストからnameが指す文字列にマッチするものを検索します。
環境名の集合および環境リストを変更する方法は処理系定義です。
成功したときはマッチしたリスト要素に関連付けられた文字列へのポインタが返されます。
この文字列をプログラムが変更してはならないが、次のgetenvの呼び出しによって上書きされるかもしれません。
指定されたnameが見つからなかった場合は、NULLポインタが返されます。

int system(const char *string)

引数stringが指す文字列を実行環境に渡し、処理系定義の方法によってコマンドプロセッサに実行させます。
stringにNULLポインタを渡すことによってコマンドプロセッサの存在を問い合わせることができます。
引数がNULLポインタであった場合、コマンドプロセッサが使用可能な時のみ0以外の値が返されます。
引数がNULLポインタでなければ、処理系定義の値が返されます。

探索・整列ユーティリティ関数

char *bsearch(const void *key, const void base, size_t nmemb, size_t size, int (compar)(const void *, const void *))

配列の要素を二分法で検索します。
baseが最初の要素を指しているnmemb個の要素をもつ配列を検索し、keyが指すオブジェクトに適合するものを見つけます。
個々の配列の要素のサイズはsizeによって指定されます。
comparが指す比較関数の引数にはkeyと配列の要素がこの順番で渡されます。
keyの方が配列の要素より小さいか、等しいか、大きいかによって負、ゼロ、正の値が返されます。
配列の要素は、keyより小さいもの、等しいもの、より大きいものの順番に並んでいる必要がある。
適合するものがあれば適合する配列の要素が返され、そうでなければNULLポインタが返されます。
2つ以上の要素が適合した場合に、どのポインタが返されるかは未定義です。

char *qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *))

配列の要素をクイックソート法で並び替えます。
baseが最初の要素を指しているnmemb個の要素をもつ配列をソートします。
個々の配列の要素のサイズはsizeによって指定されます。
配列の中身はcomparが指す関数に従って昇順にソートされます。
comparが指す比較関数の2つの引数には比較されるオブジェクトへのポインタが渡されます。
最初の引数の方が次の引数より小さいか、等しいか、大きいかによって負、ゼロ、正の値が返されます。
配列の要素は、keyより小さいもの、等しいもの、より大きいものの順番に並んでいる必要があります。
2つ以上の要素が適合した場合に、どのポインタが返されるかは未定義です。

整数算術関数

int abs(int j)

引数jの絶対値を計算します。
結果が表現不可能な場合の動作は未定義です。※
jの絶対値が返されます。
※:2の補数表現では、最も小さい負の値の絶対値は表現できません。

div_t div(int numer, int denom)

整数の除算を行い、商と余りを返します。
numerをdenomで割った商と余りを計算します。
割り切れない場合、商は代数的な商に近い整数のうち大きさが小さいほうとなります。
結果が表現できない場合の動作は未定義です。
そうでなければquot * denom + remはnumerと等しくなります。
商と余りから成るdiv_t構造体が返されます。
div_t構造体は以下のメンバを持ちます。

メンバ名説明
intquot商(quotient)
intrem余り(remainder)

long int labs(long int j)

absのlong版です。

ldiv_t ldiv(long int numer, long int denom)

divのlong版です。

long int llabs(long long int j)

absのlong long版です。

lldiv_t lldiv(long long int numer, long long int denom)

divのlong long版です。

マルチバイト文字・ワイド文字変換関数

int mblen(const char *s, size_t n)

sがNULLポインタでなければ、sが指すマルチバイト文字のバイト数を決定します。
mbtowcのシフト状態が影響を受けないことを除けば、これは以下と同等です。

mbtowc((wchar_t *)0, s, n);

sがNULLポインタである場合、状態依存の符号化を持つか持たないかで非0か0が返されます。
sがNULLポインタでない場合、sがNULL文字を指す時は0が返され、n以下のバイト数で正しいマルチバイト文字が形成される時はマルチバイト文字内のバイト数が返され、マルチバイト文字として認識されない時は-1が返されます。

int mbtowc(wchar_t *pwc, const char *s, size_t n)

sがNULLポインタでなければ、sが指すマルチバイト文字のバイト数を決定します。
次に、マルチバイト文字に相当するwchar_tで表す文字コードを決定します。
(NULL文字に相当する文字コードは0です。)
マルチバイト文字が認識可能で、pwcがNULLポインタでなければ、pwcが指すオブジェクトにその文字コードが格納されます。
sが指す配列の最大nバイトまでが吟味されます。
sがNULLポインタである場合、状態依存の符号化を持つか持たないかで非0か0が返されます。
sがNULLポインタでない場合、sがNULL文字を指す時は0が返され、n以下のバイト数で正しいマルチバイト文字が形成される時はマルチバイト文字内のバイト数が返され、マルチバイト文字として認識されない時は-1が返されます。
戻り値はnやMB_CUR_MAXマクロの値より大きくなることはありません。

int wctomb(char *s, wchar_t wchar)

wcharの値のワイド文字に対応する、シフト状態の変化を含むマルチバイト文字を決定します。
対応するマルチバイト文字は、sがNULLポインタでなければsが指す配列オブジェクトに格納されます。
最大でMB_CUR_MAX文字が格納されます。
wcharの値が0なら、シフト状態は初期に戻ります。
sがNULLポインタである場合、状態依存の符号化を持つか持たないかで非0か0が返されます。
sがNULLポインタでない場合、wcharの値に対応する認識可能なマルチバイト文字がなければ-1が返され、対応するものがあればそのマルチバイト文字に含まれるバイト数が返されます。
戻り値はMB_CUR_MAXマクロの値より大きくなることはありません。

マルチバイト文字列・ワイド文字列変換関数

size_t mbstowcs(wchar_t *pwcs, const char *s, size_t n)

マルチバイト文字列をワイド文字列に変換します。
引数sが指す初期シフト状態で始まるマルチバイト文字の連続を対応するn以下のコードとして、pwcsの指す配列オブジェクトに格納します。
NULL文字以降のマルチバイト文字は吟味されることも、変換されることもありません。
各マルチバイト文字は、関数のシフト状態が変わらないことを除けば、mbtowcの呼び出しによって変換されたかのように変換されます。
pwcsが指す配列オブジェクトのn以前の要素は変更されます。
重複するオブジェクトの間でコピーが行われた時の動作は未定義です。
認識不可能なマルチバイト文字に出くわした場合は-1が返されます。
そうでなければ、終端0コードを除いた、変更された配列の要素数が返されます。
配列は戻り値がnである場合にはNULL止めされません。

size_t wcstombs(char *s, const wchar_t *pwcs, size_t n)

ワイド文字列をマルチバイト文字列に変換します。
pwcsが指すコードの連続を初期シフト状態で始まる、対応するマルチバイト文字の連続に変換し、 結果がnバイトに達する手前で止め、マルチバイト文字としてsの指す配列オブジェクトに格納します。
各マルチバイト文字は、関数のシフト状態が変わらないことを除けば、wctombの呼び出しによって変換されたかのように変換されます。
sが指す配列オブジェクトのn以前の要素は変更されます。
重複するオブジェクトの間でコピーが行われた時の動作は未定義です。
対応する認識可能なマルチバイト文字が存在しないコードに出くわした場合は-1が返されます。
そうでなければ、終端NULL文字を除いた、変更されたバイト数が返されます。
配列は戻り値がnである場合にはNULL止めされません。

スポンサーリンク
C言語
コッコ隊長の勉強部屋

コメント