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

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

va_arg

概要 可変個実引数の値を返し、次の引数へ進む。
ヘッダ stdio.h
形式 #define va_arg(ap, type) *((type*)((ap+=sizeof(type))-sizeof(type)))
引数 ap va_list型の変数。
type 実引数の型。
戻り値 実引数の値。
詳細 va_list が保持している、実引数へのポインタが指す値を、type の型として返す。 更に、type の大きさの分だけ、ポインタを進めることで、次回の va_arg の呼び出しに備える。
また、「形式」が示す実装例のように、引数type で指定した型名の後ろに「*」を付けて使用されるため、 「type*」が「type へのポインタ型」になるように指定しなければならない。
注意 va_startva_end の呼び出しの間で呼ばなければならない。
実際に可変個引数として渡されてきた後の型と、type で指定する型とが一致していなければ、未定義の動作になる。 また、末尾の可変個引数を越えて、値を得ようとすることは、未定義の動作である。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

void print(const char* format, ...);

int main(void)
{
	print( "ddcd", 10, 20, 'x', 30 );
	print( "ss", "abc", "def" );
	print( "dfc", 50, 3.3f, 'Z' );

	return 0;
}

/*
	標準出力へ任意の個数・型の値を出力する
	引数:
		format:		出力フォーマットを表す文字を並べたもの。
						d … 符号付き整数型
						f … 浮動小数点数型
						c … 文字型
						s … 文字列型
					とする。
					例えば、"dds" と指定すると、
					後続の実引数が 整数型, 整数型, 文字列型 の順番で並んでいるものと判断される。
		...:		出力する値のリスト
*/
void print(const char* format, ...)
{
	const char* p;
	va_list args;

	va_start( args, format );

	for( p = format; *p != '\0'; ++p ){
		switch( *p ){
		case 'd':
			printf( "%d ", va_arg(args, int) );
			break;
		case 'f':
			printf( "%f ", va_arg(args, double) );
			break;
		case 'c':
			printf( "%c ", va_arg(args, char) );
			break;
		case 's':
			printf( "%s ", va_arg(args, const char*) );
			break;
		default:
			assert( !"不正なフォーマット指定" );
			break;
		}
	}
	printf( "\n" );

	va_end( args );
}

実行結果

10 20 x 30
abc def
50 3.300000 Z
関連 va_startva_end の呼び出しの間で使用する。
解説章 第52章

va_end

概要 可変個引数の処理を終えるときに呼び出す。
ヘッダ stdio.h
形式 #define va_end(ap) ((ap)=(va_list)0)
引数 ap va_list型の変数。
戻り値 なし。
詳細
注意 va_start を呼び出したのであれば、可変個引数の処理を終えるときに、必ず呼び出さなければならない。 逆に、va_start を呼び出していないのに、va_end を呼び出したときは未定義の動作となる。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

void print(const char* format, ...);

int main(void)
{
	print( "ddcd", 10, 20, 'x', 30 );
	print( "ss", "abc", "def" );
	print( "dfc", 50, 3.3f, 'Z' );

	return 0;
}

/*
	標準出力へ任意の個数・型の値を出力する
	引数:
		format:		出力フォーマットを表す文字を並べたもの。
						d … 符号付き整数型
						f … 浮動小数点数型
						c … 文字型
						s … 文字列型
					とする。
					例えば、"dds" と指定すると、
					後続の実引数が 整数型, 整数型, 文字列型 の順番で並んでいるものと判断される。
		...:		出力する値のリスト
*/
void print(const char* format, ...)
{
	const char* p;
	va_list args;

	va_start( args, format );

	for( p = format; *p != '\0'; ++p ){
		switch( *p ){
		case 'd':
			printf( "%d ", va_arg(args, int) );
			break;
		case 'f':
			printf( "%f ", va_arg(args, double) );
			break;
		case 'c':
			printf( "%c ", va_arg(args, char) );
			break;
		case 's':
			printf( "%s ", va_arg(args, const char*) );
			break;
		default:
			assert( !"不正なフォーマット指定" );
			break;
		}
	}
	printf( "\n" );

	va_end( args );
}

実行結果

10 20 x 30
abc def
50 3.300000 Z
関連 va_start と対応関係を持っている。
解説章 第52章

va_list

概要 可変個引数の集まりを表現する型。
ヘッダ stdarg.h
形式 typedef void* va_list;
詳細 可変個引数を処理する各種マクロ(va_***)が使用する型。 形式は環境によって異なる。
注意
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

void print(const char* format, ...);

int main(void)
{
	print( "ddcd", 10, 20, 'x', 30 );
	print( "ss", "abc", "def" );
	print( "dfc", 50, 3.3f, 'Z' );

	return 0;
}

/*
	標準出力へ任意の個数・型の値を出力する
	引数:
		format:		出力フォーマットを表す文字を並べたもの。
						d … 符号付き整数型
						f … 浮動小数点数型
						c … 文字型
						s … 文字列型
					とする。
					例えば、"dds" と指定すると、
					後続の実引数が 整数型, 整数型, 文字列型 の順番で並んでいるものと判断される。
		...:		出力する値のリスト
*/
void print(const char* format, ...)
{
	const char* p;
	va_list args;

	va_start( args, format );

	for( p = format; *p != '\0'; ++p ){
		switch( *p ){
		case 'd':
			printf( "%d ", va_arg(args, int) );
			break;
		case 'f':
			printf( "%f ", va_arg(args, double) );
			break;
		case 'c':
			printf( "%c ", va_arg(args, char) );
			break;
		case 's':
			printf( "%s ", va_arg(args, const char*) );
			break;
		default:
			assert( !"不正なフォーマット指定" );
			break;
		}
	}
	printf( "\n" );

	va_end( args );
}

実行結果

10 20 x 30
abc def
50 3.300000 Z
関連
解説章 第52章

va_start

概要 va_list を初期化する。
ヘッダ stdio.h
形式 #define va_start(ap, v) ((ap)=(va_list)&(v)+sizeof(v))
引数 ap va_list型の変数。
v 可変個引数でない最後の実引数。
戻り値 なし。
詳細 va_list に、最初の可変個実引数を指すポインタを設定する。 これは直接的に指定することができないため、可変個部分でない最後の実引数を指定し、 マクロ内で計算によって導き出している。
注意 va_argva_end を呼ぶ前に必ず呼び出さなければならない。 また、va_end を呼ぶ前に、同じ va_list に対して、va_start を繰り返し呼び出してはならない。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

void print(const char* format, ...);

int main(void)
{
	print( "ddcd", 10, 20, 'x', 30 );
	print( "ss", "abc", "def" );
	print( "dfc", 50, 3.3f, 'Z' );

	return 0;
}

/*
	標準出力へ任意の個数・型の値を出力する
	引数:
		format:		出力フォーマットを表す文字を並べたもの。
						d … 符号付き整数型
						f … 浮動小数点数型
						c … 文字型
						s … 文字列型
					とする。
					例えば、"dds" と指定すると、
					後続の実引数が 整数型, 整数型, 文字列型 の順番で並んでいるものと判断される。
		...:		出力する値のリスト
*/
void print(const char* format, ...)
{
	const char* p;
	va_list args;

	va_start( args, format );

	for( p = format; *p != '\0'; ++p ){
		switch( *p ){
		case 'd':
			printf( "%d ", va_arg(args, int) );
			break;
		case 'f':
			printf( "%f ", va_arg(args, double) );
			break;
		case 'c':
			printf( "%c ", va_arg(args, char) );
			break;
		case 's':
			printf( "%s ", va_arg(args, const char*) );
			break;
		default:
			assert( !"不正なフォーマット指定" );
			break;
		}
	}
	printf( "\n" );

	va_end( args );
}

実行結果

10 20 x 30
abc def
50 3.300000 Z
関連 可変個引数の一連の処理を終えるとき、va_start と対応関係にある va_end を呼ぶ。
解説章 第52章

vfprintf関数

概要 任意のストリームへ、フォーマット指定された文字列を出力する。
ヘッダ stdio.h
形式 int vfprintf(FILE* stream, const char* format, va_list args);
引数 stream 出力先のストリーム。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、fprintf関数と同様であり、同じ機能を持つ。
フォーマット指定の詳細については、printf関数を参照。
注意 va_list に、必要な個数の引数が含まれていない場合の動作は未定義だが、 余分に存在している場合には、評価は行われるが、vfprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>

static void warning(FILE* fp, const char* str, ...);

int main(void)
{
	FILE* fp;
	int value = 100;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	if( value != 0 ){
		warning( fp, "value: %d\n", value );
	}

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

	return 0;
}

void warning(FILE* fp, const char* str, ...)
{
	va_list args;

	va_start( args, str );

	fprintf( fp, "[WARNING] " );
	vfprintf( fp, str, args );

	va_end( args );
}

実行結果 (test.txt):

[WARNING] value: 100
関連 標準出力へ同様のフォーマット指定を行い出力するには、vprintf関数を使う。 変換結果を文字配列に格納するには vsprintf関数が使える。
va_list の代わりに、... を用いたバージョンとして、fprintf関数がある。
C95規格からは、ワイド文字に対応した vfwprintf関数が追加されている。
解説章 第52章

vfscanf関数

概要 任意のストリームから、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int vfscanf(FILE* stream, const char* format, va_list arg);
引数 stream 対象のストリーム。
format フォーマット指定文字列。
arg format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、fscanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>

static void checked_input(FILE* fp, int count, const char* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vfscanf( fp, format, args ) != count ){
		assert("vfscanf error");
	}
	va_end( args );
}

int main(void)
{
	FILE* fp;
	int num;
	char str[10];
	double f;

	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	checked_input( fp, 3, "%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル (test.txt):

100 abc 2.500000

実行結果

100 abc 2.500000
関連 ワイド文字版の vfwscanf関数がある。
標準入力に対して同様のフォーマット指定を行い入力を受け取るには、vscanf関数を使う。 対象が文字列の場合は、vsscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、fscanf関数がある。
解説章

vfwprintf関数

概要 任意のストリームへ、フォーマット指定されたワイド文字列を出力する。
ヘッダ wchar.h
形式 int vfwprintf(FILE* stream, const wchar_t* format, va_list args);
引数 stream 出力先のストリーム。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、fwprintf関数と同様であり、同じ機能を持つ。
フォーマット指定の詳細については、printf関数を参照。
注意 va_list に、必要な個数の引数が含まれていない場合の動作は未定義だが、 余分に存在している場合には、評価は行われるが、vfwprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <wchar.h>

static void warning(FILE* fp, const wchar_t* str, ...);

int main(void)
{
	FILE* fp;
	int value = 100;

	fp = fopen( "test.txt", "w" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	if( value != 0 ){
		warning( fp, L"value: %d\n", value );
	}

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

	return 0;
}

void warning(FILE* fp, const wchar_t* str, ...)
{
	va_list args;

	va_start( args, str );

	fprintf( fp, "[WARNING] " );
	vfwprintf( fp, str, args );

	va_end( args );
}

実行結果 (test.txt):

[WARNING] value: 100
関連 マルチバイト文字に対応した vfprintf関数がある。
標準出力へ同様のフォーマット指定を行い出力するには、vwprintf関数を使う。 変換結果を文字配列に格納するには vswprintf関数が使える。
va_list の代わりに、... を用いたバージョンとして、fwprintf関数がある。
解説章 第52章

vfwscanf関数

概要 任意のストリームから、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ stdio.h、wchar.h
形式 int vfscanf(FILE* stream, const wchar_t* format, va_list arg);
引数 stream 対象のストリーム。
format フォーマット指定文字列。
arg format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、fwscanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <assert.h>

static void checked_input(FILE* fp, int count, const wchar_t* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vfwscanf( fp, format, args ) != count ){
		assert("vfwscanf error");
	}
	va_end( args );
}

int main(void)
{
	FILE* fp;
	int num;
	char str[10];
	double f;

	fp = fopen( "test.txt", "r" );
	if( fp == NULL ){
		exit( EXIT_FAILURE );
	}

	checked_input( fp, 3, L"%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );
	
	if( fclose( fp ) == EOF ){
		fputs( "ファイルクローズに失敗しました。\n", stderr );
		exit( EXIT_FAILURE );
	}

	return 0;
}

入力ファイル (test.txt):

100 abc 2.500000

実行結果

100 abc 2.500000
関連 マルチバイト文字版の vfscanf関数がある。
標準入力に対して同様のフォーマット指定を行い入力を受け取るには、vwscanf関数を使う。 対象が文字列の場合は、vswscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、fwscanf関数がある。
解説章

vprintf関数

概要 標準出力へ、フォーマット指定された文字列を出力する。
ヘッダ stdio.h
形式 int vprintf(const char* format, va_list args);
引数 format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、printf関数と同様であり、同じ機能を持つ。
注意 va_list に、必要な個数の引数が含まれていない場合の動作は未定義だが、 余分に存在している場合には、評価は行われるが、vprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdarg.h>

void warning(const char* str, ...);

int main(void)
{
	int value = 100;

	if( value != 0 ){
		warning( "value: %d\n", value );
	}

	return 0;
}

void warning(const char* str, ...)
{
	va_list args;

	va_start( args, str );

	printf( "[WARNING] " );
	vprintf( str, args );

	va_end( args );
}

実行結果:

[WARNING] value: 100
関連 任意のストリームへ同様のフォーマット指定を行い出力するには、vfprintf関数を使う。 変換結果を文字配列に格納するには vsprintf関数が使える。
va_list の代わりに、... を用いたバージョンとして、printf関数がある。
C95規格からは、ワイド文字に対応した vwprintf関数が追加されている。
解説章 第52章

vscanf関数

概要 標準入力から、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int vscanf(const char* format, va_list args);
引数 format フォーマット指定文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、scanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

static void checked_input(int count, const char* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vscanf( format, args ) != count ){
		assert("vscanf error");
	}
	va_end( args );
}

int main(void)
{
	int num;
	double f;

	checked_input( 2, "%d %lf", &num, &f );
	printf( "%d %f\n", num, f );

	return 0;
}

実行結果

10 5.5
10 5.500000
関連 任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、fscanf関数を使う。 対象が文字列の場合は、sscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、scanf関数がある。
また、ワイド文字に対応した vwscanf関数がある。
解説章 第52章

vsprintf関数

概要 フォーマット指定された文字列を格納する。
ヘッダ stdio.h
形式 int vsprintf(char* s, const char* format, va_list args);
引数 s 結果を格納するアドレス。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、sprintf関数と同様であり、同じ機能を持つ。
フォーマット指定の詳細については、printf関数を参照。
文字列s の末尾には、自動的に '\0' が付加される。
注意 va_list に、必要な個数の引数が含まれていない場合の動作は未定義。 余分に存在している場合には、評価は行われるが、vsprintf関数としては無視する。
vprintf関数と異なり、文字列へ格納するという事情から、バッファオーバーフローの可能性を配慮しなければならない。
使用例
#include <stdio.h>
#include <stdarg.h>

static void warning(char* buf, const char* str, ...);

int main(void)
{
	char buf[256] = "";
	int value = 100;

	if( value != 0 ){
		warning( buf, "value: %d\n", value );
	}

	puts( buf );

	return 0;
}

void warning(char* buf, const char* str, ...)
{
	va_list args;

	va_start( args, str );

	sprintf( buf, "[WARNING] " );
	vsprintf( buf, str, args );

	va_end( args );
}

実行結果:

[WARNING] value: 100

関連 標準出力へ同様のフォーマット指定を行い出力するには、vprintf関数を使う。 任意のストリームへ出力するには vfprintf関数が使える。
va_list の代わりに、... を用いたバージョンとして、sprintf関数がある。
C95規格からは、ワイド文字に対応した vswprintf関数が追加されている。 vswprintf関数には、出力サイズの上限指定が含まれており、引数の形式が異なるが、規格上、vsprintf関数と対応するのは vswprintf関数しかない。
解説章

vsnprintf関数

概要 フォーマット指定された文字列を格納する。
ヘッダ stdio.h
形式 int vsnprintf(char* s, size_t n, const char* format, va_list args);
引数 s 結果を格納するアドレス。
n 終端に書き込まれる '\0' を含めた、格納する最大文字数。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、snprintf関数と同様であり、同じ機能を持つ。
引数n で指定した文字数 - 1 の文字列が格納され、末尾に '\0' が付加される。
引数 n が 0 の場合、'\0' も含めて、何も書き込まれない。
注意
使用例
#include <stdio.h>
#include <stdarg.h>

static void warning(char* buf, size_t size, const char* str, ...);

int main(void)
{
	char buf[256] = "";
	int value = 100;

	if( value != 0 ){
		warning( buf, sizeof(buf), "value: %d\n", value );
	}

	puts( buf );

	return 0;
}

void warning(char* buf, size_t size, const char* str, ...)
{
	va_list args;

	va_start( args, str );

	sprintf( buf, "[WARNING] " );
	vsnprintf( buf, size, str, args );

	va_end( args );
}

実行結果:

value: 100
関連 命名規則が合致していないが、ワイド文字版は vswprintf関数である。 vsnwprintf のような名前の標準関数は存在しない。
va_list の代わりに、... を用いたバージョンとして、 snprintf関数がある。
解説章

vsscanf関数

概要 文字列から、フォーマット指定付きで文字列を受け取る。
ヘッダ stdio.h
形式 int vsscanf(const char* s, const char* format, va_list arg);
引数 s 入力文字列。
format フォーマット指定文字列。
arg format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、sscanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>

static void checked_input(const char* s, int count, const char* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vsscanf( s, format, args ) != count ){
		assert("vsscanf error");
	}
	va_end( args );
}

int main(void)
{
	const char s[] = "100 abc 2.5";

	int num;
	char str[10];
	double f;

	checked_input( s, 3, "%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );

	return 0;
}

実行結果:

100 abc 2.500000
関連 ワイド文字版の vswscanf関数がある。
任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、vfscanf関数を使う。 対象が標準入力の場合は、vscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、sscanf関数がある。
解説章

vswprintf関数

概要 フォーマット指定されたワイド文字列を格納する。
ヘッダ stdio.h、wchar.h
形式 int vswprintf(wchar_t* s, size_t n, const wchar_t* format, va_list args);
引数 s 結果を格納するアドレス。
n 終端に書き込まれる L'\0' を含めた、格納する最大文字数。
format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、 (命名規則が異なるが)swprintf関数と同様であり、同じ機能を持つ。
引数n で指定した文字数 - 1 の文字列が格納され、末尾に '\0' が付加される。
引数 n が 0 の場合、L'\0' も含めて、何も書き込まれない。
注意
使用例
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>

static void warning(wchar_t* buf, size_t size, const wchar_t* str, ...);

int main(void)
{
	wchar_t buf[256] = L"";
	int value = 100;

	if( value != 0 ){
		warning( buf, sizeof(buf) / sizeof(wchar_t), L"value: %d\n", value );
	}

	wprintf( L"%ls\n", buf );

	return 0;
}

void warning(wchar_t* buf, size_t size, const wchar_t* str, ...)
{
	va_list args;

	va_start( args, str );

	swprintf( buf, size, L"[WARNING] " );
	vswprintf( buf, size, str, args );

	va_end( args );
}

実行結果:

value: 100
関連 マルチバイト文字版として、vsprintf関数が存在するが、引数 n に相当するものが無い。 C99 になって、引数 n が存在する vsnprintf関数が追加されており、 こちらの方が適切に対応されたマルチバイト文字版である。
va_list の代わりに、... を用いたバージョンとして、 swprintf関数がある。
解説章

vswscanf関数

概要 ワイド文字列から、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ stdio.h、wchar.h
形式 int vswscanf(const wchar_t* s, const wchar_t* format, va_list arg);
引数 s 入力文字列。
format フォーマット指定文字列。
arg format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、swscanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <wchar.h>

static void checked_input(const wchar_t* s, int count, const wchar_t* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vswscanf( s, format, args ) != count ){
		assert("vswscanf error");
	}
	va_end( args );
}

int main(void)
{
	const wchar_t s[] = L"100 abc 2.5";

	int num;
	char str[10];
	double f;

	checked_input( s, 3, L"%d %s %lf", &num, str, &f );
	printf( "%d %s %f\n", num, str, f );

	return 0;
}

実行結果:

100 abc 2.500000
関連 マルチバイト文字版の vsscanf関数がある。
任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、vfwscanf関数を使う。 対象が標準入力の場合は、vwscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、swscanf関数がある。
解説章

vwprintf関数

概要 標準出力へ、フォーマット指定されたワイド文字列を出力する。
ヘッダ wchar.h
形式 int vwprintf(const wchar_t* format, va_list args);
引数 format フォーマット指定を含んだ、あるいは含まないプレーンな文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には負数を返す。 正常終了した場合には 0以上の値を返す。
詳細 引数... が va_list に変わっていること以外は、wprintf関数と同様であり、同じ機能を持つ。
注意 va_list に、必要な個数の引数が含まれていない場合の動作は未定義だが、 余分に存在している場合には、評価は行われるが、vwprintf関数としては無視する。
使用例
#include <stdio.h>
#include <stdarg.h>
#include <wchar.h>

static void warning(const wchar_t* str, ...);

int main(void)
{
	int value = 100;

	if( value != 0 ){
		warning( L"value: %d\n", value );
	}

	return 0;
}

void warning(const wchar_t* str, ...)
{
	va_list args;

	va_start( args, str );

	printf( "[WARNING] " );
	vwprintf( str, args );

	va_end( args );
}

実行結果:

[WARNING] value: 100
関連 マルチバイト文字に対応した vprintf関数がある。
任意のストリームへ同様のフォーマット指定を行い出力するには、vfwprintf関数を使う。 変換結果を文字配列に格納するには vswprintf関数が使える。
va_list の代わりに、... を用いたバージョンとして、wprintf関数がある。
解説章 第52章

vwscanf関数

概要 標準入力から、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ wchar.h
形式 int vwscanf(const wchar_t* format, va_list args);
引数 format フォーマット指定文字列。
args format に含まれているフォーマット指定子に対応した、可変個引数リスト。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 引数... が va_list に変わっていること以外は、scanf関数と同様であり、同じ機能を持つ。
注意
使用例
#include <stdio.h>
#include <wchar.h>
#include <stdarg.h>
#include <assert.h>

static void checked_input(int count, const wchar_t* format, ...)
{
	va_list args;

	va_start( args, format );
	if( vwscanf( format, args ) != count ){
		assert("vwscanf error");
	}
	va_end( args );
}

int main(void)
{
	int num;
	double f;

	checked_input( 2, L"%d %lf", &num, &f );
	printf( "%d %f\n", num, f );

	return 0;
}

実行結果

10 5.5
10 5.500000
関連 任意のストリームに対して同様のフォーマット指定を行い入力を受け取るには、vfwscanf関数を使う。 対象が文字列の場合は、vswscanf関数が使える。
va_list の代わりに、... を用いたバージョンとして、wscanf関数がある。
また、マルチバイト文字に対応した vscanf関数がある。
解説章 第52章

参考リンク

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

更新履歴

'2017/5/23 va_arg、va_start、va_end の説明を追加。

'2017/5/17 va_list の説明を追加。

'2017/5/9 vsscanf関数、vswscanf関数の説明を追加。

'2017/5/8 vfscanf関数、vfwscanf関数の説明を追加。

'2017/5/1 vsnprintf関数、vswprintfの説明を追加。

'2017/3/17 vfwprintf関数、vwprintf関数の説明を追加。

'2017/3/9 vscanf関数、vwscanf関数の説明を追加。

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

'2011/5/8 vfprintf関数、vprintf関数、vsprintf関数の説明を追加。

'2010/4/30 新規作成。



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

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

Programming Place Plus のトップページへ