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

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

raise関数

概要 シグナルを発生させる。
ヘッダ signal.h
形式 int raise(int sig);
引数 sig シグナル番号。
戻り値 成功したときは 0、失敗したときは 0以外を返す。
詳細 引数sig に指定するシグナル番号は、標準で定義された以下の6個と、環境が独自に定義した値のいずれかである。
意味
SIGABRT abort関数の呼び出しによって起こる異常終了。
SIGFPE ゼロ除算のような、誤った算術演算。
SIGILL コンピュータの不正命令によって起こるエラー。
SIGINT Ctrl+C の入力のような、ユーザーとの対話によって起こるシグナル。
SIGSEGV メモリの不正アクセス。
SIGTERM 別プログラムやユーザーからの終了シグナル。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

static void abort_handler(int sig)
{
	puts( "abort_handler" );
	exit( EXIT_FAILURE );
}

int main(void)
{
	signal( SIGABRT, abort_handler );
	raise( SIGABRT );

	return 0;
}

実行結果

abort_handler
関連 シグナル発生時の動作を、signal関数によって設定できる。
解説章

rand関数

概要 擬似乱数を得る。
ヘッダ stdlib.h
形式 int rand(void);
引数 なし
戻り値 0〜RAND_MAX の範囲の値。
詳細 呼び出すたびに、新たに生成された擬似乱数を返す。
事前に、元となる値(乱数の種)を設定しない限り、生成される乱数は同じである。 乱数の種は、srand関数で設定できる。 設定を行わずに rand関数を呼び出した場合は、srand(1); を呼び出した場合と同じ結果を生む。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
	int i;

	srand( (unsigned int)time(NULL) );

	for( i = 0; i < 20; ++i ){
		printf( "%d\n", rand() );
	}

	return 0;
}

実行結果

24581
7509
3789
26783
4399
29529
32633
12466
5097
24208
22247
1387
4598
18428
26406
2410
6408
26077
12162
6298
関連 擬似乱数を生成する元となる値(乱数の種)を、srand関数で設定できる。
解説章 第51章

RAND_MAX

概要 rand関数が返す最大値を表す。
ヘッダ stdlib.h
形式 #define RAND_MAX 32767
置換結果 rand関数が返す最大値。
詳細
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int i;

	/* 0〜1 の範囲の浮動小数点数の乱数を生成する */
	for( i = 0; i < 10; ++i ){
		printf( "%f\n", (double)rand() / RAND_MAX );
	}

	return 0;
}

実行結果:

0.001251
0.563585
0.193304
0.808741
0.585009
0.479873
0.350291
0.895962
0.822840
0.746605
関連
解説章

realloc関数

概要 メモリ領域を再割り当てする。
ヘッダ stdlib.h
形式 void* realloc(void* ptr, size_t size);
引数 ptr 再割り当てする領域。または NULL
size アロケートする領域の大きさをバイト単位で指定する。 または 0 を指定する(この場合、解放を意味する)
戻り値 再割り当てされた領域の先頭を指すポインタ。 メモリ不足などの要因で失敗した場合には、NULL が返される。
詳細 malloc関数calloc関数、realloc関数のいずれかでアロケートされた領域を指定し、 異なるサイズで再度アロケートし直す。以前の領域は適切に解放される。
引数ptr を NULL にした場合、malloc関数と同じ動作になる。 また、引数ptr が NULL でなく、引数size が 0 の場合、free関数と同じ動作になる。
アロケートされた領域が不要になったら、free関数で解放(システムへ返却)することができる。
システムがメモリ領域を管理するための追加の領域が必要なため、実際に割り当てられる大きさは、size を超える可能性がある。
再割り当て前の領域にあったデータは、新しい領域へコピーされる。
注意 引数ptr が NULL であり、かつ、引数size が 0 の場合の挙動は未定義である。
再割り当てに失敗したとき NULL が返されるが、この場合、以前の領域は解放されることなく残されている。 そのため、「ptr = realloc( ptr, 1000 );」のように、第1引数に渡すポインタ変数を使って、戻り値を受け取ってしまうと、 エラーになったときに、以前の領域に対する free関数の呼び出しを行う手段が無くなってしまう可能性がある。 この後の使用例のように、一旦、別の変数に受け取るべきだろう。
使用例
#include <stdio.h>
#include <stdlib.h>

#define ALLOCATE_SIZE_1ST	(5)
#define ALLOCATE_SIZE_2ND	(10)

int main(void)
{
	int* values;
	int* tmp;
	int i;
	
	values = malloc( sizeof(int) * ALLOCATE_SIZE_1ST );
	if( values == NULL ){
		exit( EXIT_FAILURE );
	}

	for( i = 0; i < ALLOCATE_SIZE_1ST; ++i ){
		values[i] = i;
	}

	/* 再割り当て */
	tmp = realloc( values, sizeof(int) * ALLOCATE_SIZE_2ND );  /* 一旦、別の変数に受け取る */
	if( tmp == NULL ){
		/* realloc関数が失敗した場合、元の領域は解放されずに残されている */
		/* 自分で free関数を呼び出して終了する */
		free( values );
		exit( EXIT_FAILURE );
	}
	values = tmp; /* 成功したら、受け取ったアドレスをコピー */
	tmp = NULL;   /* 安全策。確保された領域を指すポインタを array だけに限定する */

	for( i = ALLOCATE_SIZE_1ST; i < ALLOCATE_SIZE_2ND; ++i ){
		values[i] = i;
	}

	for( i = 0; i < ALLOCATE_SIZE_2ND; ++i ){
		printf( "%d\n", values[i] );
	}

	free( values );

	return 0;
}

実行結果:

0
1
2
3
4
5
6
7
8
9
関連 アロケートに関わる標準関数として、他に malloc関数calloc関数free関数がある。
解説章 第35章

remove関数

概要 ファイルを削除する。
ヘッダ stdio.h
形式 int remove(const char* filename);
引数 filename 削除するファイルの名前。
戻り値 成功したときは 0、失敗したときは 0以外の値を返す。
詳細 指定されたファイルを、アクセスできない状態にする。これは一般的に言って、ファイルを削除することを意味している。
ファイルの名前の表現方法は環境によって異なる(パスの指定方法や、拡張子の存在など)。
注意 指定されたファイルが、何らかのアプリケーションによってオープンされた状態であるときの動作は、環境に依存する。
使用例
#include <stdio.h>

int main(void)
{
	remove( "test.txt" );

	return 0;
}

実行結果:


	
関連
解説章 第44章

rename関数

概要 ファイルの名前を変更する。
ヘッダ stdio.h
形式 int rename(const char* oldname, const char* newname);
引数 oldname 古いファイル名。
newname 変更後のファイル名。
戻り値 成功したときは 0、失敗したときは 0以外の値を返す。
詳細 oldname で指定した名前を持つファイルを、newname で指定した名前にリネームする。
ファイルの名前の表現方法は環境によって異なる(パスの指定方法や、拡張子の存在など)。
この関数の本来的な目的はリネームであるが、ファイルを別の位置へ移動させる目的でも流用できる(第44章参照)
注意 newname で指定した名前と同じ名前のファイルが既に存在している場合の動作は、環境に依存する。 ただし、oldname で指定した方のファイルの名前はそのまま変化しないことは保証される。
oldname で指定した名前を持つファイルが、オープンされている場合、名前の変更作業が行えないことがある。 その場合には単に失敗し、0以外の値が返される。
使用例
#include <stdio.h>

int main(void)
{
	rename( "test.txt", "new.txt" );

	return 0;
}

実行結果:


	
関連
解説章 第44章

rewind関数

概要 カレントポジションを先頭まで巻き戻す。
ヘッダ stdio.h
形式 void rewind(FILE* stream);
引数 stream 対象のストリーム。
戻り値 なし
詳細 ファイルポジションを、ファイルの先頭まで戻す。
対象のストリームに対する、ファイル終了およびエラーの発生を意味するフラグをクリアし、 feof関数ferror関数の結果が偽になるような状態にする。
この関数はちょうど、「clearerr(stream); fseek(stream, 0L, SEEK_SET);」のように 2つの関数の呼び出しを組み合わせたときの動作と一致する。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	char buf[80];


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

	fgets( buf, sizeof(buf), fp );
	printf( "%s", buf );
	rewind( fp );
	fgets( buf, sizeof(buf), fp );
	printf( "%s", buf );


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

	return 0;
}

入力ファイル (test.txt)

1行目
2行目
3行目

実行結果:

1行目
1行目
関連 ファイルポジションの移動は、fseek関数でも行える。 また、現在のファイルポジションの位置を ftell関数で問い合わせることができる。
解説章 第40章

round関数

概要 小数点以下を四捨五入する。
ヘッダ math.h
形式 double round(double x);
引数 x 対象の浮動小数点数。
戻り値 引数x を小数点以下で四捨五入した値。
詳細 引数x に最も近い整数を返すと捉えることができる。 2つの整数と等距離にある場合は、絶対値が大きい方を返す。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", round(3.25) );
	printf( "%f\n", round(-3.25) );
	printf( "%f\n", round(0.0) );

	return 0;
}

実行結果:

3.000000
-3.000000
0.000000
関連 float型バージョンの roundf関数と、 long double型バージョンの roundl関数がある。
なお、切り捨ては floor関数、 切り上げは ceil関数で行える。
解説章

roundf関数

概要 小数点以下を四捨五入する。
ヘッダ math.h
形式 float roundf(float x);
引数 x 対象の浮動小数点数。
戻り値 引数x を小数点以下で四捨五入した値。
詳細 引数x に最も近い整数を返すと捉えることができる。 2つの整数と等距離にある場合は、絶対値が大きい方を返す。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%f\n", roundf(3.25f) );
	printf( "%f\n", roundf(-3.25f) );
	printf( "%f\n", roundf(0.0f) );

	return 0;
}

実行結果:

3.000000
-3.000000
0.000000
関連 double型バージョンの round関数と、 long double型バージョンの roundl関数がある。
なお、切り捨ては floorf関数、 切り上げは ceilf関数で行える。
解説章

roundl関数

概要 小数点以下を四捨五入する。
ヘッダ math.h
形式 long double roundl(long double x);
引数 x 対象の浮動小数点数。
戻り値 引数x を小数点以下で四捨五入した値。
詳細 引数x に最も近い整数を返すと捉えることができる。 2つの整数と等距離にある場合は、絶対値が大きい方を返す。
注意
使用例
#include <stdio.h>
#include <math.h>

int main(void)
{
	printf( "%Lf\n", roundl(3.25L) );
	printf( "%Lf\n", roundl(-3.25L) );
	printf( "%Lf\n", roundl(0.0L) );

	return 0;
}

実行結果:

3.000000
-3.000000
0.000000
関連 float型バージョンの roundf関数と、 double型バージョンの round関数がある。
なお、切り捨ては floorl関数、 切り上げは ceill関数で行える。
解説章

参考リンク

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

更新履歴

'2017/5/27 round関数、roundf関数、roundl関数の説明を追加。

'2017/5/25 raise関数の説明を追加。

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

'2011/5/1 srand関数、RAND_MAX の説明を追加。

'2010/10/2 rename関数の説明を追加。

'2010/5/27 realloc関数、remove関数、rewind関数の説明を追加。

'2008/12/17 新規作成。



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

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

Programming Place Plus のトップページへ