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

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

tan関数

概要 正接を計算する。
ヘッダ math.h
形式 double tan(double x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正接。
ただし、結果が表現できない場合、想定外の値を返す可能性がある。
詳細 いわゆる三角関数のタンジェントを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
引数x が、π/2 の奇数倍に近い値のとき、正しい結果が表現できず、値域エラーが発生する可能性がある。 この場合、errnoERANGE がセットされる。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	double deg = -80.0;
	int i;

	for( i = 0; i <= 16; ++i ){
		printf( "tan(%.1f) = %f\n", deg, tan(DEG_TO_RAD(deg)) );
		deg += 10.0;
	}

	return 0;
}

実行結果:

tan(-80.0) = -5.671282
tan(-70.0) = -2.747477
tan(-60.0) = -1.732051
tan(-50.0) = -1.191754
tan(-40.0) = -0.839100
tan(-30.0) = -0.577350
tan(-20.0) = -0.363970
tan(-10.0) = -0.176327
tan(0.0) = 0.000000
tan(10.0) = 0.176327
tan(20.0) = 0.363970
tan(30.0) = 0.577350
tan(40.0) = 0.839100
tan(50.0) = 1.191754
tan(60.0) = 1.732051
tan(70.0) = 2.747477
tan(80.0) = 5.671282
関連 余弦は cos関数、正弦は sin関数で求められる。
また、逆正接を atan関数、および atan2関数で求められる。
C99 においては、float型版の tanf関数、long double型版の tanl関数が存在する。
解説章

tanf関数

概要 正接を計算する。
ヘッダ math.h
形式 float tanf(float x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正接。
ただし、結果が表現できない場合、想定外の値を返す可能性がある。
詳細 いわゆる三角関数のタンジェントを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
引数x が、π/2 の奇数倍に近い値のとき、正しい結果が表現できず、値域エラーが発生する可能性がある。 この場合、errnoERANGE がセットされる。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	float deg = -80.0f;
	int i;

	for( i = 0; i <= 16; ++i ){
		printf( "tan(%.1f) = %f\n", deg, tanf((float)DEG_TO_RAD(deg)) );
		deg += 10.0f;
	}

	return 0;
}

実行結果:

tan(-80.0) = -5.671280
tan(-70.0) = -2.747477
tan(-60.0) = -1.732051
tan(-50.0) = -1.191754
tan(-40.0) = -0.839100
tan(-30.0) = -0.577350
tan(-20.0) = -0.363970
tan(-10.0) = -0.176327
tan(0.0) = 0.000000
tan(10.0) = 0.176327
tan(20.0) = 0.363970
tan(30.0) = 0.577350
tan(40.0) = 0.839100
tan(50.0) = 1.191754
tan(60.0) = 1.732051
tan(70.0) = 2.747477
tan(80.0) = 5.671280
関連 double型版の tan関数、long double型版の tanl関数が存在する。
余弦は cosf関数、正弦は sinf関数で、 逆正接は atanf関数、および atan2f関数で求められる。
解説章

tanl関数

概要 正接を計算する。
ヘッダ math.h
形式 long double tanl(long double x);
引数 x 求める角のラジアン値。
戻り値 引数x を角θのラジアン値としたときの正接。
ただし、結果が表現できない場合、想定外の値を返す可能性がある。
詳細 いわゆる三角関数のタンジェントを求める関数である。
注意 実装方法によるが、誤差の度合いや、誤差の生まれ方の特徴は異なるので、許容できるかどうかはよく調べる必要がある。
引数x が、π/2 の奇数倍に近い値のとき、正しい結果が表現できず、値域エラーが発生する可能性がある。 この場合、errnoERANGE がセットされる。
使用例
#include <stdio.h>
#include <math.h>

#define DEG_TO_RAD(deg)  ((deg) / 180.0 * 3.14159265358979323846)  /* 度からラジアンへの変換 */

int main(void)
{
	long double deg = -80.0L;
	int i;

	for( i = 0; i <= 16; ++i ){
		printf( "tan(%.1Lf) = %Lf\n", deg, tanl(DEG_TO_RAD(deg)) );
		deg += 10.0L;
	}

	return 0;
}

実行結果:

tan(-80.0) = -5.671282
tan(-70.0) = -2.747477
tan(-60.0) = -1.732051
tan(-50.0) = -1.191754
tan(-40.0) = -0.839100
tan(-30.0) = -0.577350
tan(-20.0) = -0.363970
tan(-10.0) = -0.176327
tan(0.0) = 0.000000
tan(10.0) = 0.176327
tan(20.0) = 0.363970
tan(30.0) = 0.577350
tan(40.0) = 0.839100
tan(50.0) = 1.191754
tan(60.0) = 1.732051
tan(70.0) = 2.747477
tan(80.0) = 5.671282
関連 float型版の tanf関数、double型版の tan関数が存在する。
余弦は cosl関数、正弦は sinl関数で、 逆正接は atanl関数、および atan2l関数で求められる。
解説章

time関数

概要 現在のカレンダー時間を取得する。
ヘッダ time.h
形式 time_t time(time_t* t);
引数 t 現在のカレンダー時間を受け取るアドレス。あるいは NULL
NULL以外を指定した場合に受け取る結果は、戻り値で返されるものと一致する。
戻り値 現在のカレンダー時間。
失敗すると -1 を time_t型にキャストした値が返される。
詳細 現在のカレンダー時間を、time_t型の値で表現したものを返す。
注意 カレンダー時間が、どのように表現されているかは環境に依存している。 この関数が返す結果は、time_t型で表現できる最良の近似に過ぎない。
使用例
#include <stdio.h>
#include <time.h>

void process(void);

int main(void)
{
	time_t begin, end;

	begin = time( NULL );
	process();
	end = time( NULL );

	printf( "result: %f seconds\n", difftime(end, begin) ); 

	return 0;
}

void process(void)
{
	char buf[80];

	puts( "何か入力すると終了します。" );
	fgets( buf, sizeof(buf), stdin );
}

実行結果:

何か入力すると終了します。
abcde
result: 4.000000 seconds
関連 localtime関数で、カレンダー時間をローカル時間に変換できる。
2つのカレンダー時間の差分を difftime関数で計算できる。
gmtime関数を使うと、カレンダー時間から世界協定時(UTC) を生成できる。
解説章 第51章

time_t

概要 整数値にコード化されたカレンダー時間(歴時間)の型。
ヘッダ time.h
形式 typedef long int time_t;
詳細 任意の算術型と定義されているため、そのサイズや符号の有無は、環境によって異なる。
注意 どのような型であるかも、どのようなフォーマットで表現されているかも不明であるため、 適当に作り出した値を time_t型として扱ったり、計算に使ったりしてはならない。 特に、2つの time_t型の値の差分を得たいときには、-演算子を使った通常の減算ではなく、 difftime関数を使わなければならないことに注意。
使用例
#include <stdio.h>
#include <time.h>

int main(void)
{
	time_t t;

	time( &t );
	puts( ctime( &t ) );

	return 0;
}

実行結果

Mon May 01 11:25:03 2017
関連 現在のカレンダー時間を表す time_t型の値を time関数で取得できる。 また、カレンダー時間の詳細な情報が格納された tm構造体の値があれば、 gmtime関数を使って、time_t型の値を得られる。
ctime関数を使うと、time_t型の値を文字列形式に変換できる。
time_t型の値同士で差分を得るには、通常の減算ではなく、difftime関数を使わなければならない。
解説章 第51章

tm

概要 カレンダー時間(歴時間)の詳細を表現する構造体。
ヘッダ time.h
形式
struct tm {
    int tm_sec;
    int tm_min;
    int tm_hour;
    int tm_mday;
    int tm_mon;
    int tm_year;
    int tm_wday;
    int tm_yday;
    int tm_isdst;
};
	
詳細 各メンバの意味と、値の範囲は以下の通りである。
メンバ 意味 範囲
tm_sec C95規格までは 0〜61。C99規格から 0〜60。
tm_min 0〜59
tm_hour 0〜23
tm_mday 1〜31
tm_mon 0〜11
tm_year 1900年を起点とした経過年
tm_wday 曜日 0〜6(日曜日を 0 とする)
tm_yday 1月1日を基準とした通算日 0〜365
tm_isdst 季節時間のフラグ 0 のときは、季節時間の処理を行わない。
0 より大きいときは、季節時間の処理を行う。
0 より小さいときは、不明である(その情報が得られないことを示す)。
注意
使用例
#include <stdio.h>
#include <time.h>
#include <assert.h>

static void printTm(const struct tm* t);

int main(void)
{
	struct tm* utc;
	time_t t;
	
	t = time( NULL );
	utc = gmtime( &t );

	printTm( utc );

	return 0;
}

void printTm(const struct tm* t)
{
	assert( t != NULL );
	
	printf( "年       : %d\n", t->tm_year );
	printf( "月       : %d\n", t->tm_mon );
	printf( "日       : %d\n", t->tm_mday );
	printf( "曜日     : %d\n", t->tm_wday );
	printf( "時       : %d\n", t->tm_hour );
	printf( "分       : %d\n", t->tm_min );
	printf( "秒       : %d\n", t->tm_sec );
	printf( "通算日   : %d\n", t->tm_yday );
	printf( "季節時間 : %d\n", t->tm_isdst );
}

実行結果

年       : 111
月       : 3
日       : 3
曜日     : 0
時       : 4
分       : 7
秒       : 27
通算日   : 92
季節時間 : 0
関連 協定世界時(UTC)を表現した tm構造体の値を gmtime関数で得られる。 また、ローカル時間(地域時間)の値を localtime関数で得られる。
tm構造体の値を基にして time_t型の値を生成する mktime関数がある。
asctime関数を使うと、tm構造体の値を文字列形式に変換することができる。
解説章 第51章

TMP_MAX

概要 tmpnam関数が生成できるファイル名の最大数を表す。
ヘッダ stdio.h
形式 #define TMP_MAX 0xffff
置換結果 tmpnam関数が生成できるファイル名の最大数。最低でも 25。
詳細 tmpnam関数が生成できるファイル名の最大数。 この回数を超えて呼び出した場合、一意なファイル名を生成できる保証が無い。
注意
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	char fname[TMP_MAX][L_tmpnam];
	int i;
	

	/* 上限一杯まで、ファイル名を生成する */
	/* 環境によっては、TMP_MAX は非常に大きい数なので注意。*/
	/*( 例えば、VisualC++ の場合、32768 である)*/
	for( i = 0; i < TMP_MAX; ++i ){
		tmpnam( fname[i] );
	}

	for( i = 0; i < TMP_MAX; ++i ){
		puts( fname[i] );
	}

	return 0;
}

実行結果:

\s5is.
\s5is.1
\s5is.2
\s5is.3
\s5is.4
\s5is.5
\s5is.6
\s5is.7
\s5is.8
\s5is.9
(以下省略)
関連
解説章

tmpfile関数

概要 一時ファイルを作成する。
ヘッダ stdio.h
形式 FILE* tmpfile(void);
引数 なし
戻り値 一時ファイルを制御する FILEオブジェクトへのポインタ。 失敗時は NULL
詳細 fopen関数の第2引数に "wb+" を指定したかのような形で、一時ファイルを作成する。
作成されたファイルは、プログラムの正常終了時、または fclose関数で明示的にクローズすると、自動的に削除される。
一時ファイルへの書き込み操作の後、rewind関数fseek関数でファイルポジションを移動させて、読み込むことができる。
注意 abort関数の呼び出し等の異常終了時には、自動的に削除されるかどうかは環境に依存する。
VisualC++ においての実装では、実行ファイルのあるディスクドライブのルートディレクトリに一時ファイルを作成する。 Windows Vista では、このディレクトリへのファイル作成は管理者権限を必要とするため、権限のないユーザが実行した場合には、 この関数は失敗すると思われる。 これが問題ならば、tmpnam関数を使い、一時ファイルに使えるファイル名を取得して、自分でファイルを作成する等の対応が必要になる。
作成された一時ファイルは、他のプログラムからもアクセスできてしまうことから、セキュリティ上の問題を持っているとも考えられる。 実行環境における事情をよく調査すること。
使用例
#include <stdio.h>
#include <stdlib.h>

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


	fp = tmpfile();
	if( fp == NULL ){
		puts( "失敗" );
		exit( EXIT_FAILURE );
	}

	fputs( "Test Message\n", fp );
	rewind( fp );
	fgets( buf, sizeof(buf), fp );

	puts( buf );

	return 0;
}

実行結果:

Test Message

関連 tmpnam関数を使えば、一時ファイルの作成ではなく、一意なファイル名を生成できる。
解説章

tmpnam関数

概要 ファイルの名前を生成する。
ヘッダ stdio.h
形式 char* tmpnam(char* s);
引数 s 生成されたファイルの名前を受け取る配列のアドレス。あるいは NULL
NULL以外を指定する場合、この配列は L_tmpnam以上の文字数が格納できるだけの容量を必要とする。
戻り値 引数s が NULL でなければ、s と同じアドレスを返す。 引数s が NULL であれば、関数内で静的変数にファイル名を生成し、その変数のアドレスを返す。
いずれの場合も、失敗すると NULL を返す。
詳細 他のファイルと衝突することのない名前を生成する。 生成された名前を使って、fopen関数を呼び出すことができる。 こうして新規に生成されたファイルは、tmpfile関数のような一時ファイルではなく、自動的に削除されるようなことはない。 削除を行うには、remove関数を使う。
この関数は、TMP_MAXマクロで定義された回数分までの呼び出ししか保証されていない。 この回数を超えて呼び出すと、一意な名前が生成される保証がなくなる。
注意 引数s を NULL にした場合は、静的変数にファイル名が格納されて、そのアドレスが返される。 従って、再度この関数を、引数s を NULL にして呼び出した際に、以前の情報は上書きされてしまう。
この関数がファイル名が生成してから、実際に fopen関数などの関数がファイルを作成するまでの間に、 他のプログラムが同じ名前のファイルを生成する可能性がある。 このようなケースは、重大なセキュリティ上の問題になるかも知れない。
また、作成された一時ファイルは、他のプログラムからもアクセスできてしまうことも問題になり得る。 実行環境における事情をよく調査すること。 安全性を高めた非標準の関数が用意されていることもある。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;
	char fname[L_tmpnam];
	
	if( tmpnam( fname ) == NULL ){
		fputs( "ファイル名の生成に失敗。", stderr );
		exit( EXIT_FAILURE );
	}


	fp = fopen( fname, "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗。", stderr );
		exit( EXIT_FAILURE );
	}

	fputs( "Test Message\n", fp );

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

	return 0;
}

実行結果(生成されたファイル):

Test Message

関連 一時ファイルを作るには tmpfile関数を使う方が良い。 ただし、環境ごとに用意されているより安全なバージョンがあるのなら、そちらを使うべきである。
解説章

tolower関数

概要 大文字から小文字へ変換する。
ヘッダ ctype.h
形式 int tolower(int c);
引数 c 対象の文字。
戻り値 引数c を小文字に変換可能であれば、変換した結果を返す。 変換できない場合は、引数c をそのまま返す。
詳細
注意
使用例
#include <stdio.h>
#include <ctype.h>

int main(void)
{
	printf( "%c\n", tolower('a') );
	printf( "%c\n", tolower('A') );
	printf( "%c\n", tolower('!') );

	return 0;
}

実行結果:

a
a
!
関連 小文字から大文字への変換は、toupper関数で行う。 また、小文字かどうかは islower関数で判定できる。
C95以降では、ワイド文字版の towlower関数がある。
解説章

toupper関数

概要 小文字から大文字へ変換する。
ヘッダ ctype.h
形式 int toupper(int c);
引数 c 対象の文字。
戻り値 引数c を大文字に変換可能であれば、変換した結果を返す。 変換できない場合は、引数c をそのまま返す。
詳細
注意
使用例
#include <stdio.h>
#include <ctype.h>

int main(void)
{
	printf( "%c\n", toupper('a') );
	printf( "%c\n", toupper('A') );
	printf( "%c\n", toupper('!') );

	return 0;
}

実行結果:

A
A
!
関連 大文字から小文字への変換は、tolower関数で行う。 また、大文字かどうかは isupper関数で判定できる。
C95以降では、ワイド文字版の towupper関数がある。
解説章

towlower関数

概要 大文字から小文字へ変換する。
ヘッダ wctype.h
形式 wint_t towlower(wint_t c);
引数 c 対象の文字。
戻り値 引数c を小文字に変換可能であれば、変換した結果を返す。 変換できない場合は、引数c をそのまま返す。
詳細
注意
使用例
#include <stdio.h>
#include <wctype.h>

int main(void)
{
	printf( "%lc\n", towlower(L'a') );
	printf( "%lc\n", towlower(L'A') );
	printf( "%lc\n", towlower(L'!') );

	return 0;
}

実行結果:

a
a
!
関連 小文字から大文字への変換は、towupper関数で行う。 また、小文字かどうかは iswlower関数で判定できる。
なお、マルチバイト文字版は tolower関数である。
解説章

towupper関数

概要 小文字から大文字へ変換する。
ヘッダ wctype.h
形式 wint_t towupper(wint_t c);
引数 c 対象の文字。
戻り値 引数c を大文字に変換可能であれば、変換した結果を返す。 変換できない場合は、引数c をそのまま返す。
詳細
注意
使用例
#include <stdio.h>
#include <wctype.h>

int main(void)
{
	printf( "%lc\n", towupper('a') );
	printf( "%lc\n", towupper('A') );
	printf( "%lc\n", towupper('!') );

	return 0;
}

実行結果:

A
A
!
関連 大文字から小文字への変換は、towlower関数で行う。 また、大文字かどうかは iswupper関数で判定できる。
なお、マルチバイト文字版は toupper関数である。
解説章

true

概要 論理値の「真」を表す値。
ヘッダ stdbool.h
形式 #define true 1
置換結果 1
詳細 C99 で追加された論理型 _Bool には、真や偽を表す特別な名前が用意されていない。 _Bool に対応する boolマクロが提供されているが、これに合わせて true も定義されている。 true という名前は、C++ において「真」を表す標準のキーワードであり、それに合わせるように定義されている。
なお、このマクロを #undef で無効化したり、再び #define で定義し直したりすることが許可されている。
注意
使用例
#include <stdio.h>
#include <stdbool.h>

int main(void)
{
	bool a = true;

	if( a ){
		puts("OK");
	}
	
	return 0;
}

実行結果:

OK
関連 「偽」であることを表す falseマクロがある。
解説章

参考リンク

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

更新履歴

'2017/5/11 FILE周りの用語について、表現を見直した。

'2017/5/1 time_t型、tm構造体の説明を追加。

'2017/3/13 towlower関数、towupper関数の説明を追加。

'2017/3/11 trueマクロの説明を追加。

'2017/3/10 tanf関数、tanl関数の説明を追加。

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

'2011/7/23 tolower関数、toupper関数の説明を追加。

'2011/5/5 time関数の説明を追加。

'2010/5/15 TMP_MAX、tmpnam関数の説明を追加。

'2010/5/10 tmpfile関数の説明を追加。

'2010/5/8 tan関数の説明を追加。

'2009/11/21 新規作成。



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

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

Programming Place Plus のトップページへ