C言語/標準ライブラリ/stdlib.h

出典: フリー教科書『ウィキブックス(Wikibooks)』
このページ「C言語/標準ライブラリ/stdlib.h」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。


ヘッダー <stdlib.h> では、一般的な実用性を持つ5つの型といくつかの関数を宣言し、いくつかのマクロを定義しています[1]

一般ユーティリティの関数の一覧
形式 機能
数値変換関数
double atof(const char *nptr); 文字列をdouble型に変換する。
int atoi(const char *nptr);
long int atol(const char *nptr);
long long int atoll(const char *nptr);
文字列をint型に変換する。
文字列をlong int型に変換する。
文字列をlong long int型に変換する。
double strtod(const char * restrict nptr, char ** restrict endptr);
float strtof(const char * restrict nptr, char ** restrict endptr);
long double strtold(const char * restrict nptr, char ** restrict endptr);
文字列をdobule型に変換する。
文字列をfloat型に変換する。
文字列をlong double型に変換する。
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long int strtoul(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base);
文字列を指定した基数でlong int型に変換する。
文字列を指定した基数でlong long int型に変換する。
文字列を指定した基数でunsigned long int型に変換する。
文字列を指定した基数でunsigned long long int型に変換する。
疑似乱数列生成関数
int rand(void); 疑似乱数整数を計算する。
void srand(unsigned int seed); 疑似乱数整数の種を与える。
記憶域管理関数
void *aligned_alloc(size_t alignment, size_t size); 指定したアライメントでメモリを確保する[2]
void *calloc(size_t nmemb, size_t size); 配列の領域を割り付ける。
void free(void *ptr); オブジェクトの領域を解放する。
void *malloc(size_t size); オブジェクトの領域を割り付ける。
void *realloc(void *ptr, size_t size); 古いオブジェクトの領域を解放し、新しいオブジェクトへのポインタを返す。
環境に関連する関数
_Noreturn void abort(void); 異常プログラム終了を引き起こす。
int atexit(void (*func)(void)); プログラム正常終了時に呼び出される関数を登録する。
_Noreturn void exit(int status); 正常プログラム終了を引き起こす。
_Noreturn void _Exit(int status); 正常プログラム終了を引き起こし、制御をホスト環境に戻す。
char *getenv(const char *name); 環境の並びの中で、一致する文字列を探索する。
int system(const char *string); コマンドプロセッサで文字列を実行する。
探索及び整列ユーティリティ
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 一致する要素を探索する。
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 配列を整列する。
整数算術関数
int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);
整数jの絶対値を計算する。
div_t div(int numer, int denom);
ldiv_t ldiv(long int numer, long int demon);
lldiv_t lldiv(long long int numer, long long int denom);
商と剰余を計算する。
多バイト文字・ワイド文字変換関数
int mblen(const char *s, size_t n); バイト数を計算する。
int mbtowc(wchar_t * restrict pwc, char * restrict s, size_t n); 多バイト文字を対応するワイド文字に変換する。
int wctomb(char *s, wchar_t wc); ワイド文字を対応する多バイト文字に変換する。
多バイト文字列・ワイド文字列変換関数
size_t mbstowcs(wchar_t * restrict pwcs, const char * restrict s, size_t n); 多バイト文字の並びを対応するワイド文字の並びに変換する。
size_t wcstombs(char * restrict s, const wchar_t * restrict pwcs, size_t n); ワイド文字の並びを多バイト文字の並びに変換する。
ランタイム制約処理C11
constraint_handler_t set_constraint_handler_s(constraint_handler_t handler);
void abort_handler_s(const char * restrict msg, void * restrict ptr, errno_t error);
void ignore_handler_s(const char * restrict msg, void * restrict ptr, errno_t error);
errno_t getenv_s(size_t * restrict len, char * restrict value, rsize_t maxsize, const char * restrict name);
void *bsearch_s(const void *key, const void *base, rsize_t nmemb, rsize_t size, int (*compar)(const void *k, const void *y, void *context), void *context);
errno_t qsort_s(void *base, rsize_t nmemb, rsize_t size, int (*compar)(const void *x, const void *y, void *context), void *context);
errno_t wctomb_s(int *restrict status, char *restrict s, rsize_t smax, wchar_t wc);
errno_t mbstowcs_s(size_t *restrict retval, wchar_t *restrict dst, rsize_t dstmax, const char * restrict src, rsize_t len);
errno_t wcstombs_s(size_t * restrict retval, char * restrict dst, rsize_t dstmax, const wchar_t * restrict src, rsize_t len);

[編集]

[3]

size_t
size_tは、sizeof演算子の結果の符号なし整数型とする。[4]
wchar_t
wchar_tは、処理系がサポートするロケールの中で最も大きな拡張文字集合のすべての要素に対して,区別可能なコードを表現できる値の範囲をもつ整数型[4]
div_t
div関数が返す値の型で、構造体型である。
ldiv_t
ldiv関数が返す値の型で、構造体型である。
lldiv_t
lldiv関数が返す値の型で、構造体型である。

マクロ[編集]

[5]

NULL
NULLは、処理系定義の空ポインタ定数に展開する。[4]
EXIT_FAILURE
EXIT_SUCCESS
上の二つのマクロは、整数定数式に展開され、それぞれホスト環境に失敗状態または成功終了状態を返すために、exit関数の実引数として使用される。
RAND_MAX
整数定数式に展開され、その値はrand関数が返す最大の値である。このマクロの最低値は32767以上である。
MB_CUR_MAX
型size_tの正の整数式に展開され、その値はその時点のロケールの拡張文字集合における多バイト文字の最大バイト数である。この値が、MB_LEN_MAXを超えることはない。

数値変換関数[編集]

[6]

atof関数[編集]

[7]

形式
#include <stdlib.h>
double atof(const char *nptr);
引数
nptr 文字列
返却値
変換された値。
機能
atof関数とは、nptrが指す文字列の最初の部分を、double型の表現に変換する関数である。
a関数は、エラーが発生したときの動作を除けば、
strtod(nptr, (char **)NULL)
と等価である。
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  double d = atof("3.14XYZ");

  printf("dの値:%.2f\n", d);
}
実行結果
dの値:3.14

atoi, atol及びatoll関数[編集]

[8]

形式
#include <stdlib.h>
int atoi(const char *nptr);
long int atol(const char *nptr);
long long int atoll(const char *nptr);
引数
nptr 文字列
返却値
変換された値。
機能
atoi関数とは、nptrが指す文字列の最初の部分を、int型の表現に変換する関数である。
atol関数とは、nptrが指す文字列の最初の部分を、long int型の表現に変換する関数である。
atoll関数とは、nptrが指す文字列の最初の部分を、long long int型の表現に変換する関数である。
これらの関数は、エラーが発生したときの動作を除けば、
(int)strtol(nptr, (char **)NULL, 10)
strtol(nptr, (char **)NULL, 10)
strtoll(nptr, (char **)NULL, 10)
とそれぞれ等価である。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i;

	i=atoi("1234");

	printf("iの値:%d\n", i);
}

strtod, strtof及びstrtold関数[編集]

[9]

形式
#include <stdlib.h>
double strtod(const char * restrict nptr, char ** restrict endptr);
float strtof(const char * restrict nptr, char ** restrict endptr);
long double strtold(const char * restrict nptr, char ** restrict endptr);
引数
nptr 入力文字列
endptr 空ポインタ。又は、末尾の文字列へのポインタの格納先。
返却値
変換が可能ならば、変換した値。変換が不可能ならば0を返す。
※正しい値が表現可能な値の範囲外である時、返却値の型と値の符号に従って、正または負のHUGE_VAL,HUGE_VALF,又はHUGE_VALLを返し、errnoにはマクロERANGEの値を格納する。結果がアンダーフローを起こす場合、返却値の型で最も小さな正規化された正の数以下の絶対値を持つ値を返し、errnoに値ERANGEを格納する(処理系定義)。
機能
strtod関数とは、nptrが指す文字列の最初の部分を、double型の表現に変換する関数である。
strtof関数とは、nptrが指す文字列の最初の部分を、float型の表現に変換する関数である。
strtold関数とは、nptrが指す文字列の最初の部分を、long double型の表現に変換する関数である。
これらの関数は、入力文字列を次の3つの部分に分割する。
[空白類文字の並び][変換対象列][末尾の文字列]
空白類文字の並びは、isspace関数で規定される。
変換対象列は、浮動小数点定数と同様の形式、又は無限大(INF及びINFINITY)若しくはNaNである。
末尾の文字列は、認識の対象とならない文字の1文字以上の並びである。
次に変換対象列の部分を浮動小数点数に変換し、その結果を返す。
endptrが空ポインタでなければ、末尾の文字列へのポインタをendptrが指すオブジェクトに格納する。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	double d;
	char *endptr;

	d=strtod("3.14This is double.", &endptr);

	printf("dの値:%.2f\n", d);
	printf("endptrの値:%s\n", endptr);
}

strtol, strtoll, strtoul及びstrtoull関数[編集]

[10]

形式
#include <stdlib.h>
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
long long int strtoll(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long int strtoul(const char * restrict nptr, char ** restrict endptr, int base);
unsigned long long int strtoull(const char * restrict nptr, char ** restrict endptr, int base);
引数
nptr 入力文字列
endptr 空ポインタ。又は、末尾の文字列へのポインタの格納先。
base 基数
返却値
変換が可能ならば、変換した値。変換が不可能ならば0を返す。
※正しい値が表現可能な値の範囲外である時、返却値の型及び値の符号に従って、LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX又はULLONG_MAXを返し、errnoにはマクロERANGEを格納する。
機能
strtol関数とは、nptrが指す文字列の最初の部分を、baseで指定した基数で、long int型の表現に変換する。
strtoll関数とは、nptrが指す文字列の最初の部分を、baseで指定した基数で、long long int型の表現に変換する。
strtoul関数とは、nptrが指す文字列の最初の部分を、baseで指定した基数で、unsigned long int型の表現に変換する。
strtoull関数とは、nptrが指す文字列の最初の部分を、baseで指定した基数で、unsigned long long int型の表現に変換する。
これらの関数は、入力文字列を次の3つの部分に分割する。
[空白類文字の並び][変換対象列][末尾の文字列]
空白類文字の並びは、isspace関数で規定される。
変換対象列は、baseの値で決まる基数によって表現される整数と同様の形式である。
末尾の文字列は、認識の対象とならない文字の1文字以上の並びである。
次に変換対象列の部分を整数に変換し、その結果を返す。
endptrが空ポインタでなければ、末尾の文字列へのポインタをendptrが指すオブジェクトに格納する。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	long int l;
	char *endptr;

	l=strtol("1234This is long int.", &endptr, 0);

	printf("lの値:%ld\n", l);
	printf("endptrの値:%s\n", endptr);
}

疑似乱数列生成関数[編集]

[11]

rand関数[編集]

[12]

形式
#include <stdlib.h>
int rand(void);
引数
なし
返却値
疑似乱数整数
機能
rand関数とは、0以上RAND_MAX以下の範囲の疑似乱数整数列を計算する関数である。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	int i;

	srand((unsigned int)time(NULL));
	i=rand();

	printf("iの値:%d\n", i);
}

srand関数[編集]

[13]

形式
#include <stdlib.h>
void srand(unsigned int seed);
引数
seed 疑似乱数列の種
返却値
なし
機能
srand関数とは、rand関数の呼び出しで返す新しい疑似乱数列の種として、seedを使用する関数である。
srand関数を同じ種の値で呼んだ場合、rand関数は同じ疑似乱数列を生成する。
rand関数をsrand関数の呼び出しより前に呼んだ場合、srandが最初に種の値を1として呼ばれた時と同じ列を生成する。
srand関数は、他の疑似乱数列生成関数の呼び出しとのデータ競合を避けるために必要ではない。
実装では、ライブラリ関数がsrand関数を呼び出していないかのように動作する。
srand関数は値を返さない。

ISO/IEC 9899:201x §7.22.2.2 The srand function ¶5 で[14]、 The following functions define a portable implementation of rand and srand. としてとして以下のようなコードを示している(RAND_MAXは32767と仮定)。

static unsigned long int next = 1;
int rand(void) // RAND_MAX assumed to be 32767
{
  next = next * 1103515245 + 12345;
  return (unsigned int)(next / 65536) % 32768;
}
void srand(unsigned int seed)
{
  next = seed;
}

記憶域管理関数[編集]

[15]

C言語では、calloc関数やmalloc関数を用いて、メモリ領域を占有できる。このような事を、メモリ領域の確保といい、また、ヒープ (heap) という。通常、下記のようにポインタの宣言の際に修飾として、calloc関数やmalloc関数を使用する。 使用が終わったら、free関数を使うことにより、(callocやmallocが)占有していたメモリを解放できる。 free関数を使わないでいると、メモリが占有されたままで残りつづける可能性があり、メモリ不足になる。このような、メモリの解放し忘れによるメモリ不足のことをメモリリークという。 aligned_allocもcallocもmallocも、メモリ領域の占有に成功した場合、返却値として、占有に成功したメモリ領域の先頭アドレスを返却する。占有に失敗した場合、空ポインタを返却する。

aligned_alloc関数[編集]

aligned_alloc関数は、ISO/IEC 9899:2011(C11)で追加されました[16]

形式
#include <stdlib.h>
void *aligned_alloc(size_t alignment, size_t size);
引数
alignment アライメント値[17]
size バイト数、引数 alignment の倍数である必要があります。
返却値
割り付けられた領域の先頭へのポインタ。領域の割り付けができなかったときは、空ポインタ。
機能
aligned_alloc関数は、指定したアライメント alignment で size 個のメモリを確保します。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>

int main(void)
{
  struct Point {
    long double x, y;
  };
  struct Point *p;
  const int size = 10;

  if ((p = (struct Point *)aligned_alloc(_Alignof(struct Point), size)) == NULL) {
    puts(strerror(errno));
    exit(EXIT_FAILURE);
  }

  printf("p = %p\n", p);
  for (int i = 0; i < size; i++)
    printf("%i: x = %Lf, y = %Lf\n", i, p[i].x, p[i].y);
  free(p);
  if ((p = (struct Point *)aligned_alloc(65536, ULONG_MAX)) == NULL) {
    puts(strerror(errno));
    exit(EXIT_FAILURE);
  }
  printf("p = %p\n", p);
  for (int i = 0; i < size; i++)
    printf("%i: x = %Lf, y = %Lf\n", i, p[i].x, p[i].y);
}
結果
p = 0x800a09000
0: x = 0.000000, y = 0.000000
1: x = 0.000000, y = 0.000000
2: x = 0.000000, y = 0.000000
3: x = 0.000000, y = 0.000000
4: x = 0.000000, y = 0.000000
5: x = 0.000000, y = 0.000000
6: x = 0.000000, y = 0.000000
7: x = 0.000000, y = 0.000000
8: x = 0.000000, y = 0.000000
9: x = 0.000000, y = 0.000000
Cannot allocate memory

calloc関数[編集]

calloc関数は、それぞれのサイズがsizeであり要素数nmembなオブジェクトの配列のための領域を割り当てます。領域はすべてのビットがゼロになるように初期化されます[18]

形式
#include <stdlib.h>
void *calloc(size_t nmemb, size_t size);
引数
nmenb 個数
size サイズ
返却値
割り付けられた領域の先頭へのポインタ。領域の割り付けができなかったときは、空ポインタ。
機能
calloc関数とは、大きさがsizeであるオブジェクトのnmemb個の配列の領域を割り付ける関数である。
その領域のすべてのビットは、0で初期化する。
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  const int nmemb = 10;
  int *p = (int *)calloc(nmemb, sizeof(int));

  if (p == NULL) {
    printf("領域の割り付けができませんでした。\n");
    exit(EXIT_FAILURE);
  }

  printf("pの値:");
  for (int i = 0; i < nmemb; i++)
    printf("%d ", p[i]);

  free(p);
}

free関数[編集]

[19]

形式
#include <stdlib.h>
void free(void *ptr);
引数
ptr
返却値
なし
機能
free関数とは、ptrが指す領域を解放し、その後の割り付けに使用できるようにする関数である。
ptrが空ポインタの場合、何もしない。
それ以外の場合で、実引数がcalloc関数、malloc関数若しくはrealloc関数によって以前に返されたポインタと一致しないとき、又はその領域がfree若しくはreallocの呼び出しによって解放されているとき、その動作は未定義である。

#calloc関数#malloc関数#realloc関数を参照せよ。

malloc関数[編集]

malloc関数は、sizeで指定されたサイズのオブジェクトのための領域を確保します。その値は不定です[18]

形式
#include <stdlib.h>
void *malloc(size_t size);
引数
size サイズ
返却値
割り付けられた領域の先頭へのポインタ。領域の割り付けができなかったときは、空ポインタ。
機能
malloc関数とは、大きさがsizeであるオブジェクトの領域を割り付ける関数である。
割り付けられたオブジェクトの値は不定である。
#include <stdio.h>
#include <stdlib.h> // for malloc() and free()

int main(void) {
  const size_t size = 10;
  int *p = (int *)malloc(sizeof(*p) * size);

  if (p == NULL) {
    printf("領域の割り付けができませんでした。\n");
    exit(EXIT_FAILURE);
  }

  for (int i = 0; i < size; i++)
    p[i] = i;

  printf("pの値:");
  for (int i = 0; i < size; i++)
    printf("%d ", p[i]);

  free(p);
}

realloc関数[編集]

[20]

形式
#include <stdlib.h>
void *realloc(void *ptr, size_t size);
引数
ptr
size
返却値
新しいオブジェクトへのポインタを返す。新しいオブジェクトの割り付けができなかった場合、空ポインタを返す。
機能
realloc関数とは、ptrが指す古いオブジェクトを解放し、大きさがsizeである新しいオブジェクトへのポインタを返す関数である。
新しいオブジェクトの内容は、新しいオブジェクトの大きさと古いオブジェクトの大きさのうち小さいほうの大きさまでの部分で、解放する前の古いオブジェクトの内容と同じである。
古いオブジェクトの大きさを超えた部分の新しいオブジェクトのバイトの値は不定である。
ptrが空ポインタの時、realloc関数は、指定された大きさでのmalloc関数と同じ動作をする。
それ以外の場合で、ptrがcalloc関数、malloc関数若しくはrealloc関数によって以前に返されたポインタと一致しないとき、又はその領域がfree若しくはreallocの呼び出しによって解放されているとき、その動作は未定義である。
新しいオブジェクトに対する記憶域の割り付けができなかった場合、古いオブジェクトは解放されずその値は変化しない。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i, *p;
	int size=10;

	if((p=(int *)malloc(sizeof(int)*size))==NULL){
		printf("領域の割り付けができませんでした。\n");
        exit(EXIT_FAILURE);
	}
	for(i=0; i<size; ++i)
		p[i]=i;
	printf("\n最初のpの値:");
	for(i=0; i<size; ++i)
		printf("%d ", p[i]);

	size=20;
	if((p=(int *)realloc(p, sizeof(int)*size))==NULL){
		printf("領域の割り付けができませんでした。\n");
        exit(EXIT_FAILURE);
	}
	for(i=10; i<size; ++i)
		p[i]=i;
	printf("\n次のpの値:");
	for(i=0; i<size; ++i)
		printf("%d ", p[i]);

	free(p);
}

環境に関連する関数[編集]

[21]

abort関数[編集]

[22]

形式
#include <stdlib.h>
_Noreturn void abort(void);
引数
なし
返却値
呼び出し元に復帰しない
機能
abort関数とは、異常プログラム終了を引き起こす関数である。
ただし、シグナルSIGABRTが捕捉されていて、かつシグナル処理ルーチンが復帰しない場合を除く。
以下の動作は処理系定義である。
  • 書き出されていないバッファリングされたデータを持つオープンしているストリームをフラッシュするかどうか
  • オープンしているストリームをクローズするかどうか
  • 一時ファイルを削除するかどうか
#include <stdlib.h>

int main(void)
{
	abort();
}

atexit関数[編集]

[23]

形式
#include <stdlib.h>
int atexit(void (*func)(void));
引数
func 関数
返却値
登録が成功したとき0、失敗したとき0以外の値。
機能
atexit関数とは、funcが指す関数を、プログラム正常終了時に実引数を持たずに呼び出される関数として登録する関数である。
少なくとも32この関数の登録がサポートされる。
#include <stdio.h>
#include <stdlib.h>

void function(void);

int main(void)
{
	atexit(function);
}

void function(void)
{
	printf("function関数が呼ばれました。\n");
}

exit関数[編集]

[24]

形式
#include <stdlib.h>
_Noreturn void exit(int status);
引数
status 状態
返却値
呼び出し元に復帰できない。
機能
exit関数とは、正常プログラム終了を引き起こす関数である。
C11でexit()に _Noreturn関数指定子が追加されたので、JISCにあった「プログラムが2回以上exit関数の呼出しを行った場合,その動作は未定義とする」に相当する文書( Each function is called as many times as it was registered, and in the correct order with respect to other registered functions. )は削除されました[25]
exit関数の動作は以下のとおりである。
  1. atexit関数で登録されたすべての関数を、登録の逆順で呼び出す。ただし、その関数より前に登録されている関数のうちで、その関数の登録時点で既に呼び出されているものに対しては、それらの呼び出しよりも後の呼び出しとなる。登録された関数の呼び出しの途中で、longjmp関数の呼び出し(登録された関数の呼び出しを終了させる。)がある場合、その動作は未定義である。
  2. 書き出されていないバッファリングされたデータを持つすべてのオープンしているストリームをフラッシュし、全てのオープンしているストリームをクローズし、さらにtmpfile関数で生成したすべてのファイルを削除する。
  3. 制御をホスト環境に戻す。statusの値が0又はEXIT_SUCCESSの場合、成功終了状態を処理系定義の形式で返す。statusの値がEXIT_FAILUREの場合、失敗終了状態を処理系定義の形式で返す。それ以外の場合、返される状態は処理系定義とする。
#include <stdlib.h>

int main(void)
{
	exit(EXIT_SUCCESS);
}

_Exit関数[編集]

[26]

形式
#include <stdlib.h>
_Noreturn void _Exit(int status);
引数
status 状態
返却値
呼び出し元に復帰できない。
機能
_Exit関数とは、正常プログラム終了を引き起こし、制御をホスト環境に戻す。
atexit関数で登録された関数及びsignal関数で登録されたシグナル処理ルーチンは呼び出さない。
ホスト環境に返される状態は、exit関数と同じ方法で決定する。#exit関数を参照せよ。
以下の動作は処理系定義である。
  • 書き出されていないバッファリングされたデータを持つオープンしているストリームをフラッシュするかどうか
  • オープンしているストリームをクローズするかどうか
  • 一時ファイルを削除するかどうか
#include <stdlib.h>

int main(void)
{
	_Exit(0);
}

getenv関数[編集]

[27]

形式
#include <stdlib.h>
char *getenv(const char *name);
引数
name 文字列
返却値
一致する並びの要素に結び付けられた文字列へのポインタ。指定されたnameが見つからないとき、空ポインタ。
機能
getenv関数とは、ホスト環境が提供する環境の並びの中で、nameが指す文字列と一致する文字列を探索する関数である。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char *os;
	os=getenv("OS");

	printf("osの値:%s\n", os);
}

system関数[編集]

[28]

形式
#include <stdlib.h>
int system(const char *string);
引数
string 空ポインタ、又はコマンド。
返却値
実引数が空ポインタの場合、コマンドプロセッサが使用可能である時に限り、0以外の値。
実引数が空ポインタでなく、かつsystem関数から復帰するとき、処理系定義の値。
機能
stringが空ポインタのとき、system関数は、ホスト環境にコマンドプロセッサが存在するかどうか調べる。
stringが空ポインタでないとき、system関数は、stringが指す文字列をコマンドプロセッサへ、その文字列を実行させるために渡す。
#include <stdlib.h>

int main(void)
{
	system("dir");//コマンドプロンプトを用いてファイルを一覧表示する。
}

探索及び整列ユーティリティ[編集]

[29]

bsearch関数[編集]

[30]

形式
#include <stdlib.h>
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
引数
key オブジェクト
base 配列先頭の要素
nmemb 配列の要素数
size 配列の要素のサイズ
compar 比較関数
返却値
配列内の一致する要素へのポインタ。一致する要素がないとき、空ポインタ。等しい要素が二つある場合、いずれの要素と一致するかは未規定である。
機能
bsearch関数とは、先頭の要素をbaseが指す(要素数がnmemb個で各要素の大きさがsizeの)オブジェクトの配列内で、keyが指すオブジェクトに一致する要素を探索する関数である。
comparが指す比較関数は、keyオブジェクトへのポインタを第一実引数とし、配列要素へのポインタを第二実引数として呼び出す。
その関数は、以下の条件を満たす必要がある。
  • keyオブジェクトが配列要素より小さい場合、0より小さい整数を返す
  • keyオブジェクトが配列要素と等しい場合、0と等しい整数を返す
  • keyオブジェクトが配列要素より大きい場合、0より大きい整数を返す
配列は、keyオブジェクトと比較して、小さい要素だけの部分、等しい要素だけの部分及び大きい要素だけの部分から構成され、これら3つの部分が、この順序で存在しなければならない。
#include <stdio.h>
#include <stdlib.h>

int compare(const int *a, const int *b);

int main(void)
{
	int key=11;
	int base[]={2, 3, 5, 7, 11, 13, 17, 19, 23, 29};
	int *ret;

	ret=bsearch(&key, base, sizeof(base)/sizeof(int), sizeof(int), (int (*)(const void *, const void *))compare);

	printf("%dはbase[%d]。", key, ret-base);	
}

int compare(const int *a, const int *b)
{
	return *a-*b;
}

qsort関数[編集]

[31]

形式
#include <stdio.h>
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
引数
base オブジェクト
nmemb 配列の要素数
size 配列の要素のサイズ
comar 比較関数
返却値
なし
機能
qsort関数とは、先頭の要素をbaseが指す(要素数がnmemb個で各要素の大きさがsizeの)オブジェクトの配列を整列する関数である。
配列の内容を、comparが指す比較関数に従って昇順に整列する。
比較関数は、比較されるオブジェクトを指す二つの実引数を持って呼び出す。
その関数は、以下の条件を満たす必要がある。
  • 最初の実引数が2番目の実引数より小さい場合、0より小さい整数を返す
  • 最初の実引数が2番目の実引数と等しい場合、0と等しい整数を返す
  • 最初の実引数が2番目の実引数より大きい場合、0より大きい整数を返す
二つの要素が等しいとき、整列された配列内でのそれらの順序は未規定である。
#include <stdio.h>
#include <stdlib.h>

int compare(const int *a, const int *b);

int main(void)
{
	int base[]={3, 2, 7, 5, 13, 11, 19, 17, 29, 23};
	int i;

	qsort(base, sizeof(base)/sizeof(int), sizeof(int), (int (*)(const void *, const void *))compare);

	printf("baseの値:");
	for(i=0; i<sizeof(base)/sizeof(int); ++i)
		printf("%d ", base[i]);	
}

int compare(const int *a, const int *b)
{
	return *a-*b;
}

整数算術関数[編集]

[32]

abs, labs, 及びllabs関数[編集]

[33]

形式
#include <stdlib.h>
int abs(int j);
long int labs(long int j);
long long int llabs(long long int j);
引数
j 整数
返却値
絶対値。
機能
abs関数とは、整数jの絶対値を計算する関数である。
labs関数とは、整数jの絶対値を計算する関数である。
llabs関数とは、整数jの絶対値を計算する関数である。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i;

	i=abs(-1234);

	printf("iの値:%d\n", i);
}

div, ldiv 及びlldiv関数[編集]

[34]

形式
#include <stdlib.h>
div_t div(int numer, int denom);
ldiv_t ldiv(long int numer, long int demon);
lldiv_t lldiv(long long int numer, long long int denom);
引数
numer 割られる数
denom 割る数
返却値
メンバのquotにnumer/denom(商)、remにnumer%denom(剰余)を含んだ構造体。
機能
div関数は、一回の呼び出しでnumer/denom(商)及びnumer%denom(剰余)の両方を計算する関数である。
ldiv関数は、一回の呼び出しでnumer/denom(商)及びnumer%denom(剰余)の両方を計算する関数である。
lldiv関数は、一回の呼び出しでnumer/denom(商)及びnumer%denom(剰余)の両方を計算する関数である。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	div_t dt;

	dt=div(10, 3);

	printf("10/3は%d。\n10%%3は%d。", dt.quot, dt.rem);
}

多バイト文字・ワイド文字変換関数[編集]

[35] 多バイト文字関数の動作は、その時点のロケールのLC_CTYPEカテゴリの影響を受ける。

mblen関数[編集]

[36]

形式
#include <stdlib.h>
int mblen(const char *s, size_t n);
引数
s 多バイト文字
n バイト個数
返却値
sが空ポインタである場合、多バイト文字の表現形式が、シフト状態に依存しているとき、0以外の値。それ以外の場合、0。
sが空ポインタでない場合、sがナル文字を指すとき0。次のn個以下のバイト長が正しい多バイト文字を形成するとき、その多バイト文字を構成するバイト数。それらが正しい多バイト文字を形成しないとき-1。
機能
mblen関数とは、sが空ポインタでないとき、sが指す多バイト文字を構成するバイト数を決定し、返却する関数である。
mbtowc関数の変換状態が影響を受けないことを除き、
mbtowc((wchar_t *)0, s, n)
と等価である。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
	char s[]="あ";
	int l;

	setlocale(LC_ALL, "JPN");//ロケール(地域)を設定する。

	l=mblen(s, 256);

	printf("%sのバイト数は%d。\n", s, l);
}

mbtowc関数[編集]

[37]

形式
#include <stdlib.h>
int mbtowc(wchar_t * restrict pwc, char * restrict s, size_t n);
引数
pwc 値を格納するオブジェクト
s 多バイト文字
n バイト個数
返却値
sが空ポインタである場合、多バイト文字の表現形式が、シフト状態に依存しているとき0以外の値、それ以外の場合0。
sが空ポインタでない場合、sがナル文字を返すとき0。次のn個以下のバイト列が正しいバイト文字を形成するときその多バイト文字を構成するバイト数。それらが正しい多バイト文字を形成しないとき-1。
※返却値はnもマクロMB_CUR_MAXの値も超えることはない。
機能
mbtowc関数の動作は以下のとおりである。
  1. sが空ポインタでない場合、sが指すバイトから最大nバイト検査し、次の多バイト文字が完了するまでのバイト数を決定する。
  2. 次の多バイト文字が正しく完了していれば、多バイト文字に対応するワイド文字の値を決定する。
  3. 次に、pwcが空ポインタでない場合、pwcが指すオブジェクトにこの値を格納する関数である。対応するワイド文字がナルワイド文字である場合、この関数の状態は初期変換状態になる。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
	char mb[]="あ";
	int ret;
	wchar_t wc;

	setlocale(LC_ALL, "JPN");//ロケール(地域)を設定する。

	ret=mbtowc(&wc, mb, 256);

	wprintf(L"wcの値:%c\n", wc);
}

wctomb関数[編集]

[38]

形式
#include <stdlib.h>
int wctomb(char *s, wchar_t wc);
引数
s 値を格納する配列
wc ワイド文字
返却値
sが空ポインタである場合、多バイト文字の表現形式が、シフト状態に依存しているとき0以外の値、それ以外の場合0。
sが空ポインタでない場合、wcの値が正しい多バイト文字に対応してないとき-1。それ以外の時、wcの値に対応する多バイト文字を構成するバイト数。
機能
wctomb関数の動作は以下のとおりである。
  1. wcで指定されるワイド文字に対応する多バイト文字を表現するために必要なバイト数を決定する。
  2. sが空ポインタでない場合、sが指す配列に多バイト文字の表現を格納する。格納される文字数は、MB_CUR_MAXを超えない。
  3. wcがナルワイド文字である場合、初期シフト状態に戻るために必要なシフトシーケンスがあればそれを格納し、さらになる文字を格納する。この場合、この関数の状態は初期変換状態になる。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
	wchar_t wc=L'あ';
	int ret;
	char mb[3]=" ";

	setlocale(LC_ALL, "JPN");//ロケール(地域)を設定する。

	ret=wctomb(mb, wc);

	printf("mbの値:%s\n", mb);
}

多バイト文字列・ワイド文字列変換関数[編集]

[39] 多バイト文字列関数の動作は、その時点のロケールのLC_CTYPEカテゴリの影響を受ける。

mbstowcs関数[編集]

[40]

形式
#include <stdlib.h>
size_t mbstowcs(wchar_t * restrict pwcs, const char * restrict s, size_t n);
引数
pwcs 変換したワイド文字列を格納する配列
s 変換する多バイト文字列
n 変換したワイド文字列の文字数
返却値
不正な多バイト文字が含まれているとき、(size_t)(-1)。
それ以外の場合、変更した配列要素の数(ただし終端ナルワイド文字は含めない)。
機能
mbstowcs関数とは、sが指す配列中の初期シフト状態で始まる多バイト文字の並びを、対応するワイド文字の並びに変換し、n個以下のワイド文字をpwcsが指す配列に格納する関数である。
ナル文字は、ナルワイド文字に変換する。
ナル文字に続く多バイト文字を調べることはなく、変換もしない。
各多バイト文字は、mbtoec関数の変換状態が影響を受けないことを除いて、mbtowc関数の呼び出しによる場合と同じ規則で変換する。
pwcsが指す配列内でn個以下の要素しか変更しない。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
	char mbs[]="あいうえお";
	int ret;
	wchar_t wcs[16];

	setlocale(LC_ALL, "JPN");//ロケール(地域)を設定する。

	ret=mbstowcs(wcs, mbs, 16);

	wprintf(L"wcsの値:%s\n", wcs);
}

wcstombs関数[編集]

[41]

形式
#include <stdlib.h>
size_t wcstombs(char * restrict s, const wchar_t * restrict pwcs, size_t n);
引数
s 変換した多バイト文字列を格納する配列
pwcs 変換するワイド文字列
n 変換した多バイト文字列の文字数
返却値
正しい多バイト文字に対応しないワイド文字が含まれているとき、(size_t)(-1)。
それ以外の場合、変更されたバイト数(ただし終端ナル文字は含めない)。
機能
wcstombs関数とは、pwcsが指す配列中のワイド文字の列を、初期シフト状態から始まる対応する多バイト文字の並びに変換し、sが指す配列に格納する関数である。
ただし、多バイト文字が合計でnバイトの上限を超えるとき、又はナル文字が格納された時、配列への格納を終了する。
各ワイド文字は、wctomb関数の変換状態が影響を受けないことを除いて、wctomb関数の呼び出しによる場合と同じ規則で変換する。
sが指す配列内でnバイト以下の要素しか変更しない。
領域の重なり合うオブジェクト間でコピーが行われるとき、その動作は未定義である。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
	wchar_t wcs[]=L"あいうえお";
	int ret;
	char mbs[16];

	setlocale(LC_ALL, "JPN");//ロケール(地域)を設定する。

	ret=wcstombs(mbs, wcs, 16);

	printf("mbsの値:%s\n", mbs);
}

脚注[編集]

  1. ^ N2596 working draft — December 11, 2020 ISO/IEC 9899:202x (E). ISO/IEC JTC1/SC22/WG14. p. 299, §7.22 General utilities <stdlib.h>. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf. 
  2. ^ ISO/IEC 9899:2011(C11)で追加されました。
  3. ^ 『JISX3010:2003』p.220「7.20 一般ユーティリティ<stdlib.h>」
  4. ^ 4.0 4.1 4.2 『JISX3010:2003』p.183「7.17 共通の定義<stddef.h>」
  5. ^ 『JISX3010:2003』p.220「7.20 一般ユーティリティ<stdlib.h>」
  6. ^ 『JISX3010:2003』p.221「7.20.1 数値変換関数」
  7. ^ 『JISX3010:2003』p.221「7.20.1.1 atof関数」
  8. ^ 『JISX3010:2003』p.221「7.20.1.2 atoi, atol及びatoll関数」
  9. ^ 『JISX3010:2003』p.222「7.20.1.3 strtod, strtof及びstrtold関数」
  10. ^ 『JISX3010:2003』p.223「7.20.1.4 strtol, strtoll, strtoul及びstrtoull関数」
  11. ^ 『JISX3010:2003』p.225「7.20.2 疑似乱数列生成関数」
  12. ^ 『JISX3010:2003』p.225「7.20.2.1 rand関数」
  13. ^ 『JISX3010:2003』p.225「7.20.2.2 srand関数」
  14. ^ N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p. 347, §7.22.2.2 The srand function. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  15. ^ 『JISX3010:2003』p.226「7.20.3 記憶域管理関数」
  16. ^ ISO/IEC 9899:201x Committee Draft — April 12, 2011 N1570. p.347, § 7.22.3.1 The aligned_alloc function. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf. 
  17. ^ 割り当てる型のアライメントは処理系によるので、を_Alignof()演算子で得た値を使うのが確実です。
  18. ^ 18.0 18.1 N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x. ISO/IEC. p. 347, §7.22.3.2 The calloc function. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf.  引用エラー: 無効な <ref> タグ; name "jtc1-sc22-wg14-n1570-7.22.3.2"が異なる内容で複数回定義されています
  19. ^ 『JISX3010:2003』p.226「7.20.3.2 free関数」
  20. ^ 『JISX3010:2003』p.226「7.20.3.4 realloc関数」
  21. ^ 『JISX3010:2003』p.227「7.20.4 環境に関連する関数」
  22. ^ 『JISX3010:2003』p.227「7.20.4.1 abort関数」
  23. ^ 『JISX3010:2003』p.227「7.20.4.2 atexit関数」
  24. ^ 『JISX3010:2003』p.227「7.20.4.3 exit関数」
  25. ^ 『ISO/IEC 9899:2011』p.91「6.7.4 Function specifiers」
  26. ^ 『JISX3010:2003』p.228「7.20.4.4 _Exit関数」
  27. ^ 『JISX3010:2003』p.228「7.20.4.5 getenv関数」
  28. ^ 『JISX3010:2003』p.228「7.20.4.6 system関数」
  29. ^ 『JISX3010:2003』p.229「7.20.5 探索及び整列ユーティリティ」
  30. ^ 『JISX3010:2003』p.229「7.20.5.1 bsearch関数」
  31. ^ 『JISX3010:2003』p.230「7.20.5.2 qsort関数」
  32. ^ 『JISX3010:2003』p.230「7.20.6 整数算術関数」
  33. ^ 『JISX3010:2003』p.230「7.20.6.1 abs, labs, 及びllabs関数」
  34. ^ 『JISX3010:2003』p.230「7.20.6.2 div, ldiv, 及びlldiv関数」
  35. ^ 『JISX3010:2003』p.231「7.20.7 多バイト文字・ワイド文字変換関数」
  36. ^ 『JISX3010:2003』p.231「7.20.7.1 mblen関数」
  37. ^ 『JISX3010:2003』p.231「7.20.7.2 mbtowc関数」
  38. ^ 『JISX3010:2003』p.232「7.20.7.3 wctomb関数」
  39. ^ 『JISX3010:2003』p.232「7.20.8 多バイト文字列・ワイド文字列変換関数」
  40. ^ 『JISX3010:2003』p.232「7.20.8.1 mbstowcs関数」
  41. ^ 『JISX3010:2003』p.233「7.20.8.2 wcstombs関数」

参考文献[編集]