C言語編 リファレンス

標準ライブラリ 「V」

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

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関数

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関数

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関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、vscanf関数としては無視する。
使用例
#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>

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関数

vsscanf関数

vswprintf関数

vswscanf関数

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関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、vwscanf関数としては無視する。
使用例
#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章

参考リンク

更新履歴

'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 のトップページへ