C言語/標準ライブラリ/一般ユーティリティ

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

概要[編集]

一般ユーティリティの関数を使用するためには、stdlib.hというヘッダファイルを組み込む必要がある。 [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 *calloc(size_t nmemb, size_t size); 配列の領域を割り付ける。
void free(void *ptr); オブジェクトの領域を解放する。
void *malloc(size_t size); オブジェクトの領域を割り付ける。
void *realloc(void *ptr, size_t size); 古いオブジェクトの領域を解放し、新しいオブジェクトへのポインタを返す。
環境に関連する関数
void abort(void); 異常プログラム終了を引き起こす。
int atexit(void (*func)(void)); プログラム正常終了時に呼び出される関数を登録する。
void exit(int status); 正常プログラム終了を引き起こす。
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); ワイド文字の並びを多バイト文字の並びに変換する。


[編集]

[2]

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

マクロ[編集]

[4]

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

数値変換関数[編集]

[5]

atof関数[編集]

[6]

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

と等価である。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	double d;

	d=atof("3.14");

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

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

[7]

  • 形式
#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関数[編集]

[8]

  • 形式
#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関数[編集]

[9]

  • 形式
#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);
}

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

[10]

rand関数[編集]

[11]

  • 形式
#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関数[編集]

[12]

  • 形式
#include <stdlib.h>
void srand(unsigned int seed);
  • 引数
seed 疑似乱数列の種
  • 返却値
なし
  • 機能
srand関数とは、rand関数の呼び出しで返す新しい疑似乱数列の種として、seedを使用する関数である。
srand関数を同じ種の値で呼んだ場合、rand関数は同じ疑似乱数列を生成する。
rand関数をsrand関数の呼び出しより前に読んだ場合、srandが最初に種の値を1として呼ばれた時と同じ列を生成する。

#rand関数を参照せよ。

記憶域管理関数[編集]

[13]

C言語では、calloc関数やmalloc関数を用いて、メモリ領域を占有できる。このような事を、メモリ領域の確保といい、また、ヒープ (heap) という。通常、下記のようにポインタの宣言の際に修飾として、calloc関数やmalloc関数を使用する。

使用が終わったら、free関数を使うことにより、(callocやmallocが)占有していたメモリを解放できる。

free関数を使わないでいると、メモリが占有されたままで残りつづける可能性があり、メモリ不足になる。このような、メモリの解放し忘れによるメモリ不足のことをメモリリークという。

よく、プログラム解説書では、callocやmallocなどによるメモリ確保は、よく借金に例えられる。借金をしたら、あとで返さないといけないように、メモリを確保したら、あとで解放しないとけいない。

(※ 未確認のノウハウなど: ) mallocやcallocを使わない場合のメモリの管理は、そのOSの仕様にもよるが、普段はOSにメモリ管理の仕組みが任されてたりするのが通常である。このため、mallocやcallocの必要がないなら、mallocなどを使わないでも、かまわないだろう。おそらくmallocやcallocの用途としては、たとえば、メモリが不十分なハードウェアでも動作するようにしたい場合や、あるいは製造業などの組み込みソフトの開発でメモリを直接管理したい場合などに、mallocやcallocが用いられるだろう。
もし malloc や calloc を用いた場合で、メモリ解法を忘れてメモリーリークが存在していても、けっしてプログラム実行環境は警告しないのが普通である。また、OSの仕様によっては、たとえ、その不具合プログラムを終了しても、メモリ解法されない場合もありうる。なぜならC言語の性質上、OSの制御にも用いられる言語であるので、OSのメモリ管理の権限を越えたコードなどもC言語では書けてしまうからである。
このため、メモリーリークが他のプログラムの動作に性能低下などの悪影響を与える場合もありうる。もっとも、電源を落として(シャットダウン)して、再起動すれば、シャットダウン時にDRAM内のメモリ情報はいったん無くなるので、個人のパソコンでは、メモリーリークはあまり大問題にはならないだろうから、心配しすぎる必要もないだろう。


callocもmallocも、メモリ領域の占有に成功した場合、返却値として、占有に成功したメモリ領域の先頭アドレスを返却する。占有に失敗した場合、空ポインタを返却する。


calloc関数[編集]

[14]

  • 形式
#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)
{
	int i, *p;
	const int nmemb=10;

	if((p=(int *)calloc(nmemb, sizeof(int)))==NULL){
		printf("領域の割り付けができませんでした。\n");
	}

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

	free(p);
}

free関数[編集]

[15]

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

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

malloc関数[編集]

[16]

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

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

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

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

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

	free(p);
}

realloc関数[編集]

[17]

  • 形式
#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");
	}
	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");
	}
	for(i=10; i<size; ++i)
		p[i]=i;
	printf("\n次のpの値:");
	for(i=0; i<size; ++i)
		printf("%d ", p[i]);

	free(p);
}

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

[18]

abort関数[編集]

[19]

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

int main(void)
{
	abort();
}

atexit関数[編集]

[20]

  • 形式
#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関数[編集]

[21]

  • 形式
#include <stdlib.h>
void exit(int status);
  • 引数
status 状態
  • 返却値
呼び出し元に復帰できない。
  • 機能
exit関数とは、正常プログラム終了を引き起こす関数である。
プログラムが2回以上exit関数の呼び出しを行った場合、その動作は未定義である。
exit関数の動作は以下のとおりである。
  1. atexit関数で登録されたすべての関数を、登録の逆順で呼び出す。ただし、その関数より前に登録されている関数のうちで、その関数の登録時点で既に呼び出されているものに対しては、それらの呼び出しよりも後の呼び出しとなる。登録された関数の呼び出しの途中で、longjmp関数の呼び出し(登録された関数の呼び出しを終了させる。)がある場合、その動作は未定義である。
  2. 書き出されていないバッファリングされたデータを持つすべてのオープンしているストリームをフラッシュし、全てのオープンしているストリームをクローズし、さらにtmpfile関数で生成したすべてのファイルを削除する。
  3. 制御をホスト環境に戻す。statusの値が0又はEXIT_SUCCESSの場合、成功終了状態を処理系定義の形式で返す。statusの値がEXIT_FAILUREの場合、失敗終了状態を処理系定義の形式で返す。それ以外の場合、返される状態は処理系定義とする。
#include <stdlib.h>

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

_Exit関数[編集]

[22]

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

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

getenv関数[編集]

[23]

  • 形式
#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関数[編集]

[24]

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

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

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

[25]

bsearch関数[編集]

[26]

  • 形式
#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関数[編集]

[27]

  • 形式
#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;
}

整数算術関数[編集]

[28]

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

[29]

  • 形式
#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関数[編集]

[30]

  • 形式
#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);
}

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

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

mblen関数[編集]

[32]

  • 形式
#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関数[編集]

[33]

  • 形式
#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関数[編集]

[34]

  • 形式
#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);
}

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

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

mbstowcs関数[編集]

[36]

  • 形式
#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関数[編集]

[37]

  • 形式
#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. ^ 『JISX3010:2003』p.220「7.20 一般ユーティリティ<stdlib.h>」
  2. ^ 『JISX3010:2003』p.220「7.20 一般ユーティリティ<stdlib.h>」
  3. ^ 3.0 3.1 3.2 『JISX3010:2003』p.183「7.17 共通の定義<stddef.h>」
  4. ^ 『JISX3010:2003』p.220「7.20 一般ユーティリティ<stdlib.h>」
  5. ^ 『JISX3010:2003』p.221「7.20.1 数値変換関数」
  6. ^ 『JISX3010:2003』p.221「7.20.1.1 atof関数」
  7. ^ 『JISX3010:2003』p.221「7.20.1.2 atoi, atol及びatoll関数」
  8. ^ 『JISX3010:2003』p.222「7.20.1.3 strtod, strtof及びstrtold関数」
  9. ^ 『JISX3010:2003』p.223「7.20.1.4 strtol, strtoll, strtoul及びstrtoull関数」
  10. ^ 『JISX3010:2003』p.225「7.20.2 疑似乱数列生成関数」
  11. ^ 『JISX3010:2003』p.225「7.20.2.1 rand関数」
  12. ^ 『JISX3010:2003』p.225「7.20.2.2 srand関数」
  13. ^ 『JISX3010:2003』p.226「7.20.3 記憶域管理関数」
  14. ^ 『JISX3010:2003』p.226「7.20.3.1 calloc関数」
  15. ^ 『JISX3010:2003』p.226「7.20.3.2 free関数」
  16. ^ 『JISX3010:2003』p.226「7.20.3.3 malloc関数」
  17. ^ 『JISX3010:2003』p.226「7.20.3.4 realloc関数」
  18. ^ 『JISX3010:2003』p.227「7.20.4 環境に関連する関数」
  19. ^ 『JISX3010:2003』p.227「7.20.4.1 abort関数」
  20. ^ 『JISX3010:2003』p.227「7.20.4.2 atexit関数」
  21. ^ 『JISX3010:2003』p.227「7.20.4.3 exit関数」
  22. ^ 『JISX3010:2003』p.228「7.20.4.4 _Exit関数」
  23. ^ 『JISX3010:2003』p.228「7.20.4.5 getenv関数」
  24. ^ 『JISX3010:2003』p.228「7.20.4.6 system関数」
  25. ^ 『JISX3010:2003』p.229「7.20.5 探索及び整列ユーティリティ」
  26. ^ 『JISX3010:2003』p.229「7.20.5.1 bsearch関数」
  27. ^ 『JISX3010:2003』p.230「7.20.5.2 qsort関数」
  28. ^ 『JISX3010:2003』p.230「7.20.6 整数算術関数」
  29. ^ 『JISX3010:2003』p.230「7.20.6.1 abs, labs, 及びllabs関数」
  30. ^ 『JISX3010:2003』p.230「7.20.6.2 div, ldiv, 及びlldiv関数」
  31. ^ 『JISX3010:2003』p.231「7.20.7 多バイト文字・ワイド文字変換関数」
  32. ^ 『JISX3010:2003』p.231「7.20.7.1 mblen関数」
  33. ^ 『JISX3010:2003』p.231「7.20.7.2 mbtowc関数」
  34. ^ 『JISX3010:2003』p.232「7.20.7.3 wctomb関数」
  35. ^ 『JISX3010:2003』p.232「7.20.8 多バイト文字列・ワイド文字列変換関数」
  36. ^ 『JISX3010:2003』p.232「7.20.8.1 mbstowcs関数」
  37. ^ 『JISX3010:2003』p.233「7.20.8.2 wcstombs関数」

参考文献[編集]

  • 日本工業標準調査会『JISX3010 プログラム言語C』2003年12月20日改正