C言語編 標準ライブラリのリファレンス「E」

先頭へ戻る

このエントリーをはてなブックマークに追加

「E」で始まる標準ライブラリ関数及び、その他の定義です。

EDOM

概要 数学関数の実引数が定義域にないことを表すエラーコード。
ヘッダ errno.h
形式 #define EDOM 33
置換結果 0以外の何らかの整数。
詳細 数学系の関数に引き渡された実引数が定義域にない場合に、errno にセットされる値である。
注意
使用例
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <float.h>

int main(void)
{
	double x;
	
	errno = 0;
	x = log( -1.0 );
	if( errno == EDOM ){
		puts( "log関数の実引数が不正" );
		return 0;
	}
	printf( "%f\n", x );

	return 0;
}

実行結果:

log関数の実引数が不正
関連 標準には、他のエラーコードとして、ERANGEEILSEQ が定義されている。 (ただし EILSEQ は C99以降)
解説章

EILSEQ

概要 マルチバイト文字、ワイド文字を変換する際のエラーを表すエラーコード。
ヘッダ errno.h
形式 #define EILSEQ 42
置換結果 0以外の何らかの整数。
詳細 名前の意味は、「Error ILlegal SEQuence(不正なシーケンス)」。 文字の変換の際、文字コードの並び(シーケンス)が不正であることを示す。 例えば、mbrtowc関数wcrtomb関数が、このエラーを発生させることがある。
注意
使用例
#if defined(_MSC_VER)
// VisualC++ において、
// 翻訳単位内の文字列リテラルを UTF-8 として扱うようにする指示。
#pragma execution_character_set("utf-8")
#endif

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <locale.h>
#include <wchar.h>

int main(void)
{
	const char mbs[] = "\xa0\xa0";  // UTF-8 として不正なコード
	wchar_t ws;
	mbstate_t state;
	size_t result;

	memset( &state, 0, sizeof(state) );

#if defined(_MSC_VER)
	setlocale( LC_ALL, "ja-JP" );
#elif defined(__clang__)
	setlocale( LC_ALL, "ja_JP" );
#endif

	errno = 0;
	result = mbrtowc( &ws, mbs, MB_CUR_MAX, &state );
	if( (int)result < 0 ){
		if( errno != 0 ){  // EILSEQ の可能性がある
			perror( "" );
		}
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果:

Illegal byte sequence
関連 標準には、他のエラーコードとして、EDOMERANGE が定義されている。
解説章

EOF

概要 ファイルの終わりを表す。
ヘッダ stdio.h
形式 #define EOF -1
置換結果 int型で負の整数。一般的には -1。
詳細 ファイルの終わりを表す。
ファイルからの読み取り時、これ以上データを読み取れないことを表すために、幾つかの標準関数が返す。 あるいは、エラーを意味していることもある。 どちらの意味で返されたかは、feof関数ferror関数で判定できる。
注意 置換結果は負の整数であり、存在する文字のコードと被らないようになっているはずである。 しかし、環境によっては char型が符号付きであり、その場合には、標準で用意されている文字以外の非標準な文字のコードと被る可能性はある。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	int c;
	
	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	while( 1 ){
		c = fgetc( fp );
		if( c == EOF ){
			break;
		}
		putchar( c );
	}

	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル(test.txt)

Test Message

実行結果(標準出力)

Test Message
関連 C95以降において、ワイド文字版として WEOFマクロが存在する。
解説章 第41章

ERANGE

概要 数学関数の結果が値域の外にあることを表すエラーコード。
ヘッダ errno.h
形式 #define ERANGE 34
置換結果 0以外の何らかの整数。
詳細 数学系の関数の計算結果が、double型の表現範囲を超えた場合に(オーバーフロー)、errno にセットされる値である。
結果が微小過ぎて表現できない(アンダーフロー)の場合には、この値がセットされる保証はない。
注意
使用例
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <float.h>

int main(void)
{
	double x;
	
	errno = 0;
	x = pow( DBL_MAX, 2.0 );
	if( errno == ERANGE ){
		puts( "pow関数の結果が表現不可能" );
		return 0;
	}
	printf( "%f\n", x );

	return 0;
}

実行結果:

pow関数の結果が表現不可能
関連 標準には、他のエラーコードとして、EDOMEILSEQ が定義されている。 (ただし EILSEQ は C95以降)
解説章

errno

概要 エラー番号を表す。
ヘッダ errno.h
形式 extern int _ERRNO;
#define errno _ERRNO;
置換結果 コンパイラの実装次第で大きく変わり得るが、変数を扱うように利用できるような定義になっている。
詳細 幾つかのライブラリ関数が、エラーの意味を報告するために共同で利用する。 設定される値は、正の整数であり、0 はエラー無しを意味する。 プログラムが開始された直後には、0 になっている。
errno を利用する関数は、呼び出す前に errno に 0 を設定しておき、関数から処理が帰ってきた直後に、errno の値を調べることによって、 エラーの有無や意味を確認できる。
注意 errno は、複数の関数が共同利用しているため、他の関数呼び出しで設定された値は簡単に上書きされてしまう。 特に、マルチスレッドプログラミングにおいては、使い方が問題になる。
使用例
#include <stdio.h>
#include <math.h>
#include <errno.h>
#include <float.h>

int main(void)
{
	double x;
	
	errno = 0;
	x = pow( DBL_MAX, 2.0 );
	if( errno == ERANGE ){
		puts( "pow関数の結果が表現不可能" );
		return 0;
	}
	printf( "%f\n", x );

	return 0;
}

実行結果:

pow関数の結果が表現不可能
関連 エラーの内容を文字列化したものを strerror関数で取得できる。 また、その文字列と同様のものを、perror関数で標準エラーストリームへ出力できる。
解説章

exit関数

概要 プログラムを正常終了させる。
ヘッダ stdlib.h
形式 void exit(int status);
引数 status システムへ返す値。
0 は終了処理に成功したことを表し、0以外は不成功を表す。それぞれの場合が具体的に何を示すかは環境による。
また、成功を表すために EXIT_SUCCESS が、不成功を表すために EXIT_FAILURE というマクロが用意されている。
戻り値 なし
詳細 終了前に、atexit関数で登録されていた関数が、登録された順番の逆順に実行される。
その後、オープンされていた出力ストリームがフラッシュおよびクローズされる。 tmpfile関数が生成していた一時ファイルも削除される。
注意 atexit関数で登録した関数の中から、更に exit関数を呼び出した場合の動作は未定義。
なお、引数に 0以外を指定した場合の動作と、abort関数の動作とは等価ではない。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	puts( "aaaaa" );

	exit( EXIT_SUCCESS );

	puts( "bbbbb" );

	return 0;
}

実行結果:

aaaaa
関連 この関数以外にプログラムを終了させる関数として、異常終了を表す abort関数がある。
解説章

EXIT_FAILURE

概要 exit関数の実引数として、不成功終了を表現する。
ヘッダ stdlib.h
形式 #define EXIT_FAILURE 1
置換結果 0以外の整数
詳細 exit関数の実引数以外に用途はない。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	exit( EXIT_FAILURE );
	puts( "これは出力されない" );

	return 0;
}

実行結果:


	
関連 成功終了を表現するために、EXIT_SUCCESSマクロが存在する。
解説章

EXIT_SUCCESS

概要 exit関数の実引数として、成功終了を表現する。
ヘッダ stdlib.h
形式 #define EXIT_SUCCESS 0
置換結果 0
詳細 exit関数の実引数以外に用途はない。 exit関数に 0 を渡すのと同じだが、意味が明確になる。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	exit( EXIT_SUCCESS );
	puts( "これは出力されない" );

	return 0;
}

実行結果:


	
関連 不成功終了を表現するために、EXIT_FAILUREマクロが存在する。
解説章

exp関数

概要 自然対数の底 e のべき乗を求める
ヘッダ math.h
形式 double exp(double x);
引数 x 指数。
戻り値 自然対数の底 e(ネイピア数)の x乗。
詳細 自然対数の底 e のべき乗、つまり自然指数を求める。従って、log関数の逆関数である。
結果が表現できない場合は、errnoERANGE が設定される。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	double x = -2.5;
	int i;

	for( i = 0; i < 11; ++i ){
		printf( "exp(%.4f) = %f\n", x, exp(x) );
		x += 0.5;
	}

	return 0;
}

実行結果

exp(-2.5000) = 0.082085
exp(-2.0000) = 0.135335
exp(-1.5000) = 0.223130
exp(-1.0000) = 0.367879
exp(-0.5000) = 0.606531
exp(0.0000) = 1.000000
exp(0.5000) = 1.648721
exp(1.0000) = 2.718282
exp(1.5000) = 4.481689
exp(2.0000) = 7.389056
exp(2.5000) = 12.182494
関連 自然対数を求めるには log関数を用いる。
C99 では、float型版の expf関数、long double型版の expl関数が追加されている。
解説章

expf関数

概要 自然対数の底 e のべき乗を求める
ヘッダ math.h
形式 float expf(float x);
引数 x 指数。
戻り値 自然対数の底 e(ネイピア数)の x乗。
詳細 自然対数の底 e のべき乗、つまり自然指数を求める。従って、logf関数の逆関数である。
結果が表現できない場合は、errnoERANGE が設定される。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	float x = -2.5f;
	int i;

	for( i = 0; i < 11; ++i ){
		printf( "exp(%.4f) = %f\n", x, expf(x) );
		x += 0.5f;
	}

	return 0;
}

実行結果

exp(-2.5000) = 0.082085
exp(-2.0000) = 0.135335
exp(-1.5000) = 0.223130
exp(-1.0000) = 0.367879
exp(-0.5000) = 0.606531
exp(0.0000) = 1.000000
exp(0.5000) = 1.648721
exp(1.0000) = 2.718282
exp(1.5000) = 4.481689
exp(2.0000) = 7.389056
exp(2.5000) = 12.182494
関連 double型版の exp関数、long double型版の expl関数がある。
自然対数を求めるには logf関数を用いる。
解説章

expl関数

概要 自然対数の底 e のべき乗を求める
ヘッダ math.h
形式 long double expl(long double x);
引数 x 指数。
戻り値 自然対数の底 e(ネイピア数)の x乗。
詳細 自然対数の底 e のべき乗、つまり自然指数を求める。従って、logl関数の逆関数である。
結果が表現できない場合は、errnoERANGE が設定される。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	long double x = -2.5L;
	int i;

	for( i = 0; i < 11; ++i ){
		printf( "exp(%.4Lf) = %Lf\n", x, expl(x) );
		x += 0.5L;
	}

	return 0;
}

実行結果

exp(-2.5000) = 0.082085
exp(-2.0000) = 0.135335
exp(-1.5000) = 0.223130
exp(-1.0000) = 0.367879
exp(-0.5000) = 0.606531
exp(0.0000) = 1.000000
exp(0.5000) = 1.648721
exp(1.0000) = 2.718282
exp(1.5000) = 4.481689
exp(2.0000) = 7.389056
exp(2.5000) = 12.182494
関連 float型版の expf関数、double型版の exp関数がある。
自然対数を求めるには logl関数を用いる。
解説章

参考リンク

Cクイックリファレンス 第2版
 -- C11対応のリファレンス。
S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル 第5版
 -- C99 まで網羅した最も詳細なリファレンス。
新ANSI C言語辞典
 -- 標準ライブラリについて詳しい。C99 には非対応。

更新履歴

'2017/5/8 EILSEQ の説明を追加。

'2017/4/23 exp関数、expf関数、expl関数の説明を追加。

'2015/8/29 サンプルプログラム中で、flose関数の戻り値をチェックするようにした。

'2010/9/4 EDOMマクロ、EOFマクロ、ERANGEマクロ、errnoマクロの説明を追加。 exit関数の説明において、atexit関数で登録した関数が呼び出される順番に関する記述を明確化。

'2010/4/3 EXIT_FAILUREマクロ、EXIT_SUCCESSマクロの説明を追加。

'2009/11/28 exit関数の説明を追加。

'2009/9/19 新規作成。



標準ライブラリのリファレンスのトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ