C言語編 リファレンス

標準ライブラリ 「P」

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

perror関数

概要 エラーメッセージを出力する。
必要なヘッダファイル stdio.h
形式 void perror(const char* s);
引数 s 追加で出力するメッセージ。不要であれば NULL でも良い。
戻り値
詳細 現在の errno の値に応じたエラーメッセージを、標準エラーストリームへ出力する。
引数s が NULL でない場合には、引数s の内容、コロン、空白文字、エラーメッセージ、改行文字の順番で出力される。
注意 エラーメッセージの内容は、環境に応じて異なる。
使用例
#include <stdio.h>
#include <errno.h>

int main(void)
{
	errno = 0;
	perror( "エラーなし" );

	errno = ERANGE;
	perror( NULL );

	return 0;
}

実行結果:

エラーなし: No error
Result too large
関連 エラーメッセージの内容は、strerror関数が返すものと同じである。
本編で解説している章

pow関数

概要 x の y乗を求める。
必要なヘッダファイル math.h
形式 double pow(double x, double y);
引数 x 底。
y 指数。
戻り値 x を y乗した結果。
結果が、オーバーフローやアンダーフローを起こす場合には、HUGE_VAL を正しい符号で表現した値が返される。 この場合には、errnoERANGE が設定される。
また、その他のケースにおいても、結果が適切に表現できない場合には、コンパイラごとに異なる不定な結果を返す可能性がある。
詳細
注意 「x が 0 で、y が負数の場合」および「x が 負数で、y が整数でない場合」 には、定義域エラーが起こり、errnoEDOM が設定される。
また、結果がオーバーフローやアンダーフローを起こす場合には、範囲エラーが起き、errno に ERANGE が設定される。 この場合の戻り値は、HUGE_VAL を正しい符号で表現した値になる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	double x = 8.5;
	double y = 5.0;
	double ans;

	errno = 0;
	ans = pow( x, y );
	if( errno != 0 ){
		perror( NULL );
		exit( EXIT_FAILURE );
	}

	printf( "ans = %f\n", ans );

	return 0;
}

実行結果:

ans = 44370.531250
関連 C99 では、float型版の powf関数、long double型版の powl関数が追加されている。
平方根の計算には、sqrt関数が使える。
本編で解説している章

powf関数

概要 x の y乗を求める。
必要なヘッダファイル math.h
形式 float powf(float x, float y);
引数 x 底。
y 指数。
戻り値 x を y乗した結果。
結果が、オーバーフローやアンダーフローを起こす場合には、HUGE_VAL を正しい符号で表現した値が返される。 この場合には、errnoERANGE が設定される。
また、その他のケースにおいても、結果が適切に表現できない場合には、コンパイラごとに異なる不定な結果を返す可能性がある。
詳細
注意 「x が 0 で、y が負数の場合」および「x が 負数で、y が整数でない場合」 には、定義域エラーが起こり、errnoEDOM が設定される。
また、結果がオーバーフローやアンダーフローを起こす場合には、範囲エラーが起き、errno に ERANGE が設定される。 この場合の戻り値は、HUGE_VAL を正しい符号で表現した値になる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	float x = 8.5f;
	float y = 5.0f;
	float ans;

	errno = 0;
	ans = powf( x, y );
	if( errno != 0 ){
		perror( NULL );
		exit( EXIT_FAILURE );
	}

	printf( "ans = %f\n", ans );

	return 0;
}

実行結果:

ans = 44370.531250
関連 double型版の pow関数、long double型版の powl関数がある。
また、平方根の計算には、sqrt関数sqrtf関数sqrtl関数が使える。
本編で解説している章

powl関数

概要 x の y乗を求める。
必要なヘッダファイル math.h
形式 long double powf(long double x, long double y);
引数 x 底。
y 指数。
戻り値 x を y乗した結果。
結果が、オーバーフローやアンダーフローを起こす場合には、HUGE_VAL を正しい符号で表現した値が返される。 この場合には、errnoERANGE が設定される。
また、その他のケースにおいても、結果が適切に表現できない場合には、コンパイラごとに異なる不定な結果を返す可能性がある。
詳細
注意 「x が 0 で、y が負数の場合」および「x が 負数で、y が整数でない場合」 には、定義域エラーが起こり、errnoEDOM が設定される。
また、結果がオーバーフローやアンダーフローを起こす場合には、範囲エラーが起き、errno に ERANGE が設定される。 この場合の戻り値は、HUGE_VAL を正しい符号で表現した値になる。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <errno.h>

int main(void)
{
	long double x = 8.5L;
	long double y = 5.0L;
	long double ans;

	errno = 0;
	ans = powl( x, y );
	if( errno != 0 ){
		perror( NULL );
		exit( EXIT_FAILURE );
	}

	printf( "ans = %Lf\n", ans );

	return 0;
}

実行結果:

ans = 44370.531250
関連 float型版の powf関数、double型版の pow関数がある。
また、平方根の計算には、sqrt関数sqrtf関数sqrtl関数が使える。
本編で解説している章

printf関数

概要 標準出力へ、フォーマット指定付きで文字列を出力する。
必要なヘッダファイル stdio.h
形式 int printf(const char* format, ...);
引数 format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
... format に含まれているフォーマット指定子に対応した個数のパラメータ。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数format の基本形式は、"%d" や "%s" といったように、指定の開始を意味する %記号と、変換指定文字の組み合わせである。 この指定の組み合わせ1つにつき、引数... の個数を1つ増やす。
ただし、後述するが、"%*d" のようにフィールド最小幅指定に * を用いた場合や、 "%.*d" のように精度指定に * を用いた場合には、 最小幅を指定するために引数... に1つ実引数を追加しなければならない。
変換指定文字には以下のものがある。
d または i 符号付き 10進整数
u 符号無し 10進整数
o 符号無し 8進整数
x 符号無し 16進整数。a-f は小文字に変換する。
X 符号無し 16進整数。a-f は大文字に変換する。
f または F 符号付き 10進浮動小数点数
e 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は小文字になる。
E 符号付き 10進浮動小数点数。科学的記数法で出力され、区切りに当たる e は大文字になる。
g f または e を指定した際の変換結果のうち、短い方を採用する
G F または E を指定した際の変換結果のうち、短い方を採用する
a 符号付き 16進浮動小数点数。a-f は小文字に変換する。C99規格で追加された。
A 符号付き 16進浮動小数点数。a-f は大文字に変換する。C99規格で追加された。
c 文字
s 文字列
p void*型の実引数に対して、そのアドレス表現に変換する
n この変換指定が現れるまでに出力された文字数に変換され、対応する実引数(整数変数へのポインタでなければならない)に格納する。
この結果は出力はされない。
% "%%" というように 2つ並べることによって、%記号1つに変換される。

指定開始文字% の直後には、変換フラグを指定しても良い。 変換フラグには以下のものがある。
- 出力フィールド幅の範囲内で、左寄せする。
+ 変換結果が符号付きの数値の場合に、符号を表す + や - を付ける。
空白文字 変換結果が符号付きの数値の場合に、符号を表す - か、空白文字を付ける。
0 出力フィールド幅が余った場合に、0 で埋める。
# デフォルトとは異なる代替形式で変換させる。具体的な意味は、変換指定文字によって異なり、以下の通りである。
o の場合 8進数の接頭語を表す 0 を先頭に付ける
x の場合 16進数の接頭語を表す 0x を先頭に付ける
X の場合 16進数の接頭語を表す 0X を先頭に付ける
f、F、e、E、g、G、a、A の場合 小数点以下の精度が 0 のときでも、小数点を表示する

変換フラグの指定の直後には、フィールド最小幅を指定しても良い。 これは 10進整数で表現され、変換結果が最低でも何文字分の領域を使用するかを指定している。 例えば、"%7d" のように指定する。
この指定は、あくまでも最小幅であって、これを超える文字数に変換された場合には、その文字数分だけ出力される。 最小幅よりも変換結果の文字数の方が小さい場合には、何らかの文字で埋められる。 このとき使用される文字は、特に指定しなければ空白文字である。 変換フラグの 0 が使用されていれば、0 で埋められる。
フィールド最小幅の指定を * としても良く、この場合には、引数... の対応する値を調べ、そこに指定されていた整数を最小幅とみなす。 例えば、printf( "%*d", length, num ); のように指定し、この場合、変数num の値を "%d" で変換しようとし、その際の最小幅には、変数length の値が使用される。
フィールド最小幅の指定の直後には、精度を指定しても良い。 これは、小数点と 10進整数で表現される。 精度が意味するところは、変換指定文字によって異なり、以下の通りである。
d、i、u、o、x、X の場合 数字の最小桁数
f、F、e、E、a、A の場合 小数点以下の桁数
g、G の場合 有効桁数
s の場合 最大文字数

精度の指定を * としても良く、この場合には、引数... の対応する値を調べ、そこに指定されていた整数を最小幅とみなす。 例えば、printf( "%*d", precision, num ); のように指定し、この場合、変数num の値を "%d" で変換しようとし、その際の精度には、変数precision の値が使用される。 フィールド最小幅指定にも * を指定していた場合には、フィールド最小幅、精度、変換対象 の順番で実引数を消費する。
精度の指定の直後には、大きさ指定子を指定しても良い。 これには以下のものがある。 これらの指定は、変換指定文字が n の場合には、対応する実引数が、どのような型へのポインタであるかを指示するという意味になる。
l 整数を変換する際、対象の型が long型または unsigned long型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が long* であることを指示する。
C95規格以降においては、 文字を変換する場合(変換指定文字が c)は、wint_t型であることを指示し、 文字列を変換する場合(変換指定文字が s)は、wint_t* であることを指示する。
ll C99規格で追加された。
整数を変換する際、対象の型が long long型または unsigned long long型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が long long* であることを指示する。
h 整数を変換する際、対象の型が short型または unsigned short型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が short* であることを指示する。
hh C99規格で追加された。
整数を変換する際、対象の型が char型または unsigned char型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が signed char* であることを指示する。
L 浮動小数点数を変換する際、対象の型が long double型であることを指示する。
j C99規格で追加された。
整数を変換する際、対象の型が intmax_t型または uintmax_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が intmax_t* であることを指示する。
z C99規格で追加された。
整数を変換する際、対象の型が size_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が size_t* であることを指示する。
t C99規格で追加された。
整数を変換する際、対象の型が ptrdiff_t型であることを指示する。 また、変換指定文字が n の場合は、対応する実引数の型が ptrdiff_t* であることを指示する。

大きさ指定子の直後には、変換指定文字が来る。これは省略できない。
引数format の中で、以上のような変換ルールと合致しない部分はそのまま出力される。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、printf関数としては無視する。
使用例
#include <stdio.h>

int main(void)
{
	short n;

#if 0
	/* VisualC++ では %n変換を使う際には、これが必要 */
	/* %n変換は危険性があるので、デフォルトでは無効になっている */
	_set_printf_count_output( 1 );
#endif

	printf( "simple string\n" );
	printf( "%d,  %s\n", 123, "abcde" );
	printf( "%08d,  %8s\n", 123, "abcde" );
	printf( "%-8d,  %8s\n", 123, "abcde" );
	printf( "%*d\n", 8, 123 );
	printf( "%3.2f\n", 12.34567f );
	printf( "%*.*f\n", 3, 2, 12.34567f );
	printf( "%s%hn\n", "abcde", &n );
	printf( "%hd\n", n );

	return 0;
}

実行結果:

simple string
123,  abcde
00000123,     abcde
123     ,     abcde
     123
12.35
12.35
abcde
5
関連 任意のストリームに対して同様のフォーマット指定を行い出力するには、fprintf関数を使う。 変換結果を文字配列に格納するには sprintf関数が使える。
実引数... の代わりに、va_list を用いたバージョンとして、vprintf関数がある。
C95規格からは、ワイド文字に対応した wprintf関数が追加されている。
本編で解説している章 第2章

ptrdiff_t

putc関数

概要 出力ストリームへ1文字出力する。
必要なヘッダファイル stdio.h
形式 int putc(int c, FILE* stream);
引数 c 出力する文字。
stream 出力ストリーム。
戻り値 成功すれば、c がそのまま返される。失敗時は EOF が返される。
詳細 マクロとして実装されている可能性があるという点を除くと、fputc関数と同じである。
注意 マクロとして実装されている可能性があるので、putc( c++, fp ); のような、 マクロの使用上問題になり得るような使い方をしてはならない。
使用例
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	FILE* fp;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	
	putc( 'a', fp );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.txt)

関連 fputc関数は同じ効果の標準関数だが、必ず関数として実装されている。 標準出力専用の putc関数として、putchar関数がある。
puts関数は、その名称からして putc関数の文字列版のようだが、標準出力専用であること等、まったく異なるものであり、 putc関数の文字列版は fputs関数の方であると考えられる。
C95以降は、ワイド文字版の putwc関数が存在する。
本編で解説している章 第41章

putchar関数

概要 標準出力へ1文字出力する。
必要なヘッダファイル stdio.h
形式 int putchar(int c);
引数 c 出力する文字。
戻り値 成功すれば、c がそのまま返される。失敗時は EOF が返される。
詳細
注意 マクロとして実装されている可能性があるので、putchar( c++ ); のような、 マクロの使用上問題になり得るような使い方をしてはならない。
使用例
#include <stdio.h>

int main(void)
{
	putchar( 'a' );

	return 0;
}

実行結果:

a
関連 putc関数は、同じ処理を行うが、対象となる出力ストリームを指定できる。 また、fputc関数は、確実に関数として実装されている。
C95以降は、ワイド文字版の putwchar関数が存在する。
本編で解説している章 第41章

puts関数

概要 標準出力へ文字列を出力する。
必要なヘッダファイル stdio.h
形式 int puts(const char* s);
引数 s 出力する文字列。
戻り値 エラー発生時には EOF を返し、正常終了時には負数でない値を返す。
詳細 引数s に指定した文字列を出力した後、更に改行文字を出力する。
注意
使用例
#include <stdio.h>

int main(void)
{
	puts( "Hello, World" );

	return 0;
}

実行結果:

Hello, World
関連 任意のストリームに対して出力するには、fputs関数を使う。
ワイド文字版の putws のような関数は存在しない。 fputws関数 で、stdout へ出力させることはできるが、 改行文字が付加されないという違いがあり、単純な置き換えはできない。 代替手段としては、wprintf関数が使える。
本編で解説している章 第2章

putwc関数

概要 出力ストリームへ1文字出力する。
必要なヘッダファイル stdio.h、wchar.h
形式 wint_t putwc(wchar_t c, FILE* stream);
引数 c 出力する文字。
stream 出力ストリーム。
戻り値 成功すれば、c がそのまま返される。失敗時は WEOF が返される。
詳細 C99以降では、コードエラーが発生した場合に、 errnoEILSEQ が設定されるかも知れない。
似た関数として、fputwc関数がある。 これは、必ず関数として実装されている。
注意 マクロとして実装されている可能性があるので、putwc( c++, fp ); のような、 マクロの使用上問題になり得るような使い方をしてはならない。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
	FILE* fp;

	setlocale( LC_CTYPE, "" );

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		fputs( "ファイルオープンに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}
	
	putwc( L'あ', fp );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

実行結果(標準出力)


実行結果(test.txt)

関連 マルチバイト文字版は、putc関数である。
fputwc関数は同じ効果の標準関数だが、必ず関数として実装されている。 標準出力専用の putwc関数として、putwchar関数がある。
putwc関数の文字列版は、fputws関数であり、 putws のような関数は存在しない。
本編で解説している章

putwchar関数

概要 標準出力へ1文字出力する。
必要なヘッダファイル stdio.h、wchar.h
形式 wint_t putwchar(wchar_t c);
引数 c 出力する文字。
戻り値 成功すれば、c がそのまま返される。失敗時は WEOF が返される。
詳細 C99以降では、コードエラーが発生した場合に、 errnoEILSEQ が設定されるかも知れない。
注意 マクロとして実装されている可能性があるので、putwchar( c++ ); のような、 マクロの使用上問題になり得るような使い方をしてはならない。
使用例
#include <stdio.h>
#include <locale.h>

int main(void)
{
	setlocale( LC_CTYPE, "" );

	putwchar( L'あ' );

	return 0;
}

実行結果:

関連 マルチバイト文字版は、putchar関数である。
putwc関数は、同じ処理を行うが、対象となる出力ストリームを指定できる。 また、fputwc関数は、確実に関数として実装されている。
本編で解説している章

参考リンク

更新履歴

'2017/4/22 putwc関数、putwchar関数の説明を追加。

'2017/3/13 printf関数の説明に、%c変換、%s変換、%n変換に対する大きさ指定に関する記述を追加。

'2017/3/8 pow関数の説明を修正。powf関数、powl関数の説明を追加。

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

'2011/5/8 printf関数の「関連」の項目を整理。

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

'2010/7/25 perror関数の説明を追加。

'2010/5/22 putc関数、putchar関数の説明を追加。

'2010/4/30 printf関数、puts関数の説明を追加。

'2008/8/29 新規作成。



リファレンスのトップページへ

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

Programming Place Plus のトップページへ