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

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

wchar_t

概要 ワイド文字型。
ヘッダ stddef.h、stdlib.h、wchar.h
形式 typedef unsigned short wchar_t;
詳細 ワイド文字を表現するための整数型。 その環境で使用できる文字のすべてを一意に表現するために必要十分なサイズを持つ。
注意 この型の大きさは、環境によって異なる。
C++ においては、wchar_t はキーワードだが、C言語では typedef である。
使用例
#include <stdio.h>
#include <stddef.h>

int main(void)
{
	printf("%lu\n", sizeof(wchar_t));

	return 0;
}

実行結果 (VisualC++ 2013/2015/2017):

2

実行結果 (clang 3.7):

4
関連
解説章 第47章

wcrtomb

wcscat関数

概要 ワイド文字列を連結する。
ヘッダ wchar.h
形式 wchar_t* wcscat(wchar_t* s1, const wchar_t* s2);
引数 s1 連結先の文字列。
s2 連結元の文字列。
戻り値 s1 と同じアドレスを返す。
詳細 s1 の末尾に s2 を連結する。
注意 s1 が指す配列に、連結後の文字列を許容できるだけの大きさが必要である。 不足していた場合の動作は未定義である。
連結結果が含まれる範囲と、連結元の範囲とが重複していた場合の動作は未定義である。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s[80];

	wcscpy( s, L"abcde" );
	wcscat( s, L"fghij" );

	wprintf( L"%s\n", s );

	return 0;
}

実行結果:

abcdefghij
関連 連結する文字数を指定できる wcsncat関数もある。
文字列が char型で表現される場合、strcat関数を使用する。
解説章

wcschr関数

概要 ワイド文字列から、特定の文字を探す。
ヘッダ wchar.h
形式 wchar_t* wcschr(const wchar_t* s, wchar_t c);
引数 s 対象の文字列。
c 探す文字。
戻り値 発見された場合は、文字列s 中の文字c を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s の先頭から検索を行い、引数c と一致する文字を探す。
文字列s の終端にある L'\0' についても、検索対象に含まれる。
注意 検索対象の文字列s は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t* p;

	p = wcschr( L"abcdef", L'd' );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		wprintf( L"%ls\n", p );
	}

	return 0;
}

実行結果:

def
関連 char型を対象とする場合は、strchr関数を使う。
文字列の末尾から逆方向に検索する wcsrchr関数がある。
また、文字列ではなく、メモリ上のバイト列を対象とした wmemchr関数がある。
文字列を探す場合は、wcsstr関数を使う。
解説章

wcscmp関数

概要 ワイド文字列を比較する。
ヘッダ wchar.h
形式 int wcscmp(const wchar_t* s1, const wchar_t* s2);
引数 s1 比較対象の文字列。
s2 比較対象の文字列。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
詳細
注意 引数に空文字列 L"" を渡しても構わないが、NULL を渡してはならない。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wprintf( L"%d\n", wcscmp(L"abc", L"abc") );
	wprintf( L"%d\n", wcscmp(L"abc", L"ab") );
	wprintf( L"%d\n", wcscmp(L"abc", L"abc123") );

	return 0;
}

実行結果:

0
1
-1
関連 wcsncmp関数は、比較する文字数を指定できる。
文字列が char型で表現される場合、strcmp関数で比較する。
文字列ではなく、メモリ上のバイト列を比較するには wmemcmp関数を使う。
解説章 第47章

wcscpy関数

概要 ワイド文字列をコピーする。
ヘッダ wchar.h
形式 wchar_t* wcscpy(wchar_t* s1, const wchar_t* s2);
引数 s1 コピー先の文字列。
s2 コピー元の文字列。
戻り値 s1 と同じアドレス。
詳細 s1 に s2 をコピーする。
注意 s1 の指す配列の容量よりも、s2 の長さの方が大きい場合の動作は未定義である。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s[20];

	wcscpy( s, L"abcde" );
	wprintf( L"%s\n", s );

	return 0;
}

実行結果:

abcde
関連 wcsncpy関数は、コピーする文字数を指定できる。
文字列が char型で表現される場合、strcpy関数で比較する。
文字列ではなく、メモリ上のバイト列をコピーするには wmemcpy関数、あるいは wmemmove関数を使う。
解説章 第47章

wcsftime関数

概要 現在のロケールに応じた日時と時刻を表すワイド文字列を返す。
ヘッダ time.h
形式 size_t wcsftime(wchar_t* s, size_t maxsize, const wchar_t* format, const struct tm* t);
引数 s 結果を格納する文字配列へのポインタ。
maxsize 結果の文字列の最大長。
format フォーマット指定文字列。
t 日付・時刻の情報が格納された tm構造体へのポインタ。
戻り値 結果の文字列の長さ。
詳細 引数t が指す tm構造体のメンバの値を使って、 現在のロケールの LC_TIMEカテゴリに応じた、日付・時刻の文字列を生成する。
フォーマット指定の方法については、マルチバイト文字版である strftime関数と同じなので、 そちらを参照のこと。
注意
使用例
#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>

#if defined(_MSC_VER)
static const char* LOCALE_NAME[] = {"ja-JP", "en-US"};
#elif defined(__clang__)
static const char* LOCALE_NAME[] = {"ja_JP", "en_US"};
#endif

int main(void)
{
	time_t now;
	struct tm* t;
	wchar_t str[256];
	
	now = time( NULL );
	t = localtime( &now );

	puts( setlocale( LC_TIME, LOCALE_NAME[0] ) );
	wcsftime( str, sizeof(str) / sizeof(wchar_t), L"%x %X", t );
	wprintf( L"%ls\n", str );

	puts( setlocale( LC_TIME, LOCALE_NAME[1] ) );
	wcsftime( str, sizeof(str) / sizeof(wchar_t), L"%x %X", t );
	wprintf( L"%ls\n", str );

	return 0;
}

実行結果:

ja-JP
2017/05/23 11:56:41
en-US
5/23/2017 11:56:41 AM

実行結果 (clang (Xcode)):

ja_JP
2017/05/23 11時56分41秒
en_US
05/23/2017 11:56:41
関連 マルチバイト文字列版の strftime関数が追加されている。
解説章

wcslen関数

概要 ワイド文字列の長さを調べる。
ヘッダ wchar.h
形式 size_t wcslen(const wchar_t* s);
引数 s 対象の文字列。
戻り値 文字列s の長さ(文字数)
詳細 末尾の L'\0' を含めない長さを調べる。空文字列 L"" の場合は 0 を返す。
返される値は文字数であって、バイト数ではない。 バイト数を知るには、返される値に sizeof(wchar_t) を乗算する必要がある。
注意 L"abc\0def" のように、途中に L'\0' を含む場合、途中の L'\0' までの長さ(この場合 3)が結果として返される。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	printf( "%d\n", (int)wcslen(L"abcdef") );

	return 0;
}

実行結果:

6
関連 1文字が1バイトの通常の文字列の長さを調べるには、strlen関数を使う。 マルチバイト文字列の場合には、mblen関数mbrlen関数が使える。
解説章 第47章

wcsncat関数

概要 ワイド文字列を連結する。
ヘッダ wchar.h
形式 wchar_t* wcsncat(wchar_t* s1, const wchar_t* s2, size_t n);
引数 s1 連結先の文字列。
s2 連結元の文字列。
n 連結する文字数。
戻り値 s1 と同じアドレスを返す。
詳細 s1 の末尾に s2 を n文字分だけ連結する。
s2 に含まれている文字数が、n に満たない場合は、s2 の末尾までが連結される。
n文字分の連結を終えた後、s1 の末尾には L'\0' が付加される。
注意 s1 が指す配列に、連結後の文字列を許容できるだけの大きさが必要である。 不足していた場合の動作は未定義である。 結果として s1 には、「元の s1 の文字数+ n + 1」の要素数が必要である。
連結結果が含まれる範囲と、連結元の範囲とが重複していた場合の動作は未定義である。
使用例
#include <stdio.h>
#include <wchar_t.h>

int main(void)
{
	wchar_t s[80];

	wcscpy( s, L"abcde" );
	wprintf( L"%s\n", wcsncat( s, L"fghij", 3 ) );
	wprintf( L"%s\n", s );

	return 0;
}

実行結果:

abcdefgh
abcdefgh
関連 文字列が char型で表現される場合、strncat関数で比較する。
解説章

wcsncmp関数

概要 ワイド文字列を比較する。
ヘッダ wchar.h
形式 int wcsncmp(const wchar_t* s1, const wchar_t* s2, size_t n);
引数 s1 比較対象の文字列。
s2 比較対象の文字列。
n 比較する文字数。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
なお、n が 0 のときの結果は常に 0 になる。
詳細 s1 と s2 を、先頭から n文字数分だけ比較する。
注意 引数に空文字列 L"" を渡しても構わないが、NULL を渡してはならない。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wprintf( L"%d\n", wcsncmp(L"abcde",L"abc", 3) );
	wprintf( L"%d\n", wcsncmp(L"abcde",L"ab", 3 ) );
	wprintf( L"%d\n", wcsncmp(L"abcde",L"abc123", 3) );

	return 0;
}

実行結果:

0
1
0
関連 文字列が char型で表現される場合、strncmp関数で比較する。
文字列ではなく、メモリ上のバイト列を比較するには wmemcmp関数を使う。
解説章

wcsncpy関数

概要 ワイド文字列をコピーする。
ヘッダ wchar.h
形式 wchar_t* wcsncpy(wchar_t* s1, const wchar_t* s2, size_t n);
引数 s1 コピー先の文字列。
s2 コピー元の文字列。
n コピーする文字数。
戻り値 s1 と同じアドレス。
詳細 s1 に s2 を n文字だけコピーする。
n が 0 のときは何も起こらない。
注意 s1 の指す配列の容量よりも、s2 の長さの方が大きい場合の動作は未定義である。
s2 の文字数が n に満たない場合には、s2 の内容がコピーされた後、更に L'\0' が付加される。 しかし、s2 の文字数が n以上ある場合、n文字分がコピーされるため、末尾の L'\0' が付加されない。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s1[10];
	wchar_t s2[10];

	wprintf( L"%s\n", wcsncpy( s1, L"abcde", 7 ) );
	wprintf( L"%s\n", wcsncpy( s2, L"abcde", 3 ) );  /* s2 の末尾に L'\0' が付かないので危険 */

	return 0;
}

実行結果:

abcde
abcフフフフフフフフフフフフフフフフフabcde
関連 文字列が char型で表現される場合、strncpy関数で比較する。
文字列ではなく、メモリ上のバイト列をコピーするには wmemcpy関数、あるいは wmemmove関数を使う。
解説章

wcsrchr関数

概要 ワイド文字列の後方から、特定の文字を探す。
ヘッダ wchar.h
形式 wchar_t* wcsrchr(const wchar_t* s, wchar_t c);
引数 s 対象の文字列。
c 探す文字。
戻り値 発見された場合は、文字列s 中の文字c を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s の末尾から検索を行い、引数c と一致する文字を探す。
文字列s の終端にある L'\0' についても、検索対象に含まれる。
注意 検索対象の文字列s は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t* p;

	p = wcsrchr( L"abcabc", L'a' );
	if( p == NULL ){
		puts( L"見つからない。" );
	}
	else{
		wprintf( L"%ls\n", p );
	}

	return 0;
}

実行結果:

abc
関連 char型を対象とする場合は、strrchr関数を使う。
文字列の先頭から順方向に検索する wcschr関数がある。
解説章

wcsstr関数

概要 ワイド文字列から、特定のワイド文字列を探す。
ヘッダ wchar.h
形式 wchar_t* wcsstr(const wchar_t* s1, const wchar_t* s2);
引数 s1 対象の文字列。
s2 探す文字列。
戻り値 発見された場合は、文字列s1 中にある文字列s2 と同じ並びの先頭を指すポインタ。
発見できなかった場合は NULL
詳細 文字列s1 の先頭から検索を行い、s2 と同じ並びを探す。 s2 が空文字列 L"" である場合、s1 の先頭のアドレスが返される。
注意 検索対象の文字列s1 は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている文字列を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t* p;

	p = wcsstr( L"abcdcba", L"cd" );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		wprintf( L"%ls\n", p );
	}

	return 0;
}

実行結果:

cdcba
関連 char型を対象とする場合は、strstr関数を使う。
単独の文字を探す場合は wcschr関数が使える。
解説章

wcstok関数

概要 ワイド文字列を分割する。
ヘッダ wchar.h
形式 wchar_t* wcstok(wchar_t* str, const wchar_t* set, wchar_t** ptr);
引数 str 対象の文字列。2回目以降の呼び出し時には NULL を指定。
set 区切り文字を書き並べた文字列。
ptr 関数が内部で作業用に使うポインタ変数を外部で用意し、そのアドレスを与える。
戻り値 区切り文字を発見した場合、その区切り文字の直後の文字を指すポインタが返される。 発見できなかった場合は NULL が返される。
詳細 まず前提として、この関数は何度も繰り返し呼び出すような使い方をすることを理解しておくべきである。
この関数の目的は、ある文字列を、一定の区切り文字ごとに分割することである。 例えば、"abc,defgh,ij" という文字列に対し、区切り文字を "," として与えれば、"abc"、"defgh"、"ij" を得られる。
1度目の呼び出しの際にだけ、引数str に対象となる文字列を指定する。 2度目以降は、前回の続きから調べるということを表すために引数str を NULL とする。 何度目の呼び出しであっても、戻り値の意味は同様であり、区切られた後の文字列の先頭アドレスが返される(これ以上区切れないときには NULL になる)。
したがって、1度目と、2度目以降とでは、引数str に与える内容は異なる。 引数set に関しては、その必要があれば呼び出しごとに異なっても構わない。
注意 関数内で、引数str が指す文字列は書き換えられることに注意(引数str には const修飾子が付いていない) 具体的には、区切り文字の部分が '\0' に書き換えられる。 こうして、戻り値として返されるアドレスが、引数str の指す文字列内のどこかに含まれ、かつ、終端に '\0' が適切に置かれていることが保証される。
char型を扱うバージョンである strtok関数とは異なり、作業用の変数は関数内部ではなく、外部で用意して与える仕様になっている。 したがって、同時に2つの異なる文字列を対象として、並列的に関数を呼び出しても、異なる作業用変数を与えれば問題なく動作する。
なお、VisualC++ 2013 においては、3個目の引数ptr が無く、これは標準規格に反しているが、 2015 では修正されている。
使用例
/* VisualC++ 2013 では、wcstok関数の第3引数が存在しないため、このサンプルはコンパイルできません */

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
	wchar_t str[] = L"abc,defhi,jk";
	const wchar_t* const separator = L",";
	wchar_t* work;
	wchar_t* token;

	setlocale(LC_CTYPE, "");

	token = wcstok( str, separator, &work );
	while( token != NULL ){
		wprintf( L"%ls\n", token );
		token = wcstok( NULL, separator, &work );
	}

	wprintf( L"\n" );
	wprintf( L"元の文字列が直接書き換えられていることを確認\n" );
	wprintf( L"%ls\n", str );

	return 0;
}

実行結果:

abc
defgh
ij

元の文字列が直接書き換えられていることを確認
abc
関連 char型版の strtok関数がある。 ただし、wcstok関数にある3個目の引数が存在せず、並列的な動作に問題がある。
解説章

wcstombs関数

概要 ワイド文字列をマルチバイト文字列に変換する。
ヘッダ stdlib.h
形式 size_t wcstombs(char* s, const wchar_t* ws, size_t n);
引数 s 変換結果を受け取るアドレス。
ws 変換対象のワイド文字列。
n 変換する最大文字数。変換後のマルチバイト文字列の文字数で指定する。
戻り値 変換後のマルチバイト文字列の文字数。終端文字の分はカウントしない。
失敗した場合には、-1 を size_t型にキャストした値が返される。
詳細 引数ws の各文字を、wctomb関数で変換することと同等。 引数ws の末尾に達するか、引数s に書き込まれた文字数が、引数n で指定した値に達したときに正常終了する。
注意
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

#define SIZE_OF_ARRAY(array) (sizeof(array)/sizeof(array[0]))

int main(void)
{
	const wchar_t ws[] = L"あいうえお";
	char mbs[16];
	size_t len;

	setlocale( LC_CTYPE, "" );

	len = wcstombs( mbs, ws, SIZE_OF_ARRAY(mbs) );
	if( len == (size_t)-1 ){
		fputs( "error\n", stderr );
		exit( EXIT_FAILURE );
	}

	printf( "%s\n", mbs );

	return 0;
}

実行結果:

あいうえお
関連 逆方向の変換であるマルチバイト文字列からワイド文字列への変換は、mbstowcs関数で行える。
解説章

wctomb関数

概要 ワイド文字をマルチバイト文字列に変換する。
ヘッダ stdlib.h
形式 int wctomb(char* s, const wchar_t w);
引数 s 変換結果を受け取るアドレス。
w 変換対象のワイド文字。
戻り値 引数s が NULL でない場合は、 引数w がマルチバイト文字に変換可能であれば、引数s が指す先へ格納することができた文字数を返し、 有効でなければ -1 を返す。
引数s が NULL であれば、現在のロケールのマルチバイト文字の表現形式がシフト状態に依存する場合は 0以外の値を返し、 依存しない場合は 0 を返す。
詳細 引数s が指す文字配列の大きさは、最低でも MB_CUR_MAX以上でなければならない。
引数s に NULL を指定した場合、内部のシフト状態が初期状態に戻される。
注意 変換結果の末尾に、終端文字('\0') は付加されない。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(void)
{
	const wchar_t ws[] = L"あいうえお";
	char* mbs;
	size_t mbs_size;
	int i, j;

	setlocale( LC_CTYPE, "" );

	/* 変換後のマルチバイト文字列を格納するバッファを確保。
	 * 1文字分のサイズは最低でも MB_CUR_MAX 以上必要。
	 */
	mbs_size = sizeof(char) * MB_CUR_MAX * (wcslen(ws) + 1);
	mbs = malloc( mbs_size );
	memset( mbs, '\0', mbs_size );

	j = 0;
	for( i = 0; ws[i] != L'\0'; ++i ){
		const int result = wctomb( &mbs[j], ws[i] );
		if( result > 0 ){
			j += result;
		}
		else {
			break;
		}
	}
	printf( "%s\n", mbs );

	free( mbs );

	return 0;
}

実行結果:

あいうえお
関連 逆方向の変換であるマルチバイト文字からワイド文字への変換は、mbtowc関数で行える。
C95 で、再開可能な形でワイド文字からマルチバイト文字列への変換を行う wcrtomb関数が追加されている。
なお、終端文字のあるワイド文字列からマルチバイト文字列への変換は、wcstombs関数で行える。
解説章 第47章

WEOF

概要 ファイルの終わりを表す。
ヘッダ wchar.h
形式 #define WEOF -1
置換結果 wint_t型の値。
詳細 ファイルの終わりを表す。
ファイルからの読み取り時、これ以上データを読み取れないことを表すために、幾つかの標準関数が返す。 あるいは、エラーを意味していることもある。 どちらの意味で返されたかは、feof関数ferror関数で判定できる。
注意 EOF とは異なり、置換結果は負数であるとは限らない。
使用例
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>

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

	while( 1 ){
		c = fgetwc( fp );
		if( c == WEOF ){
			break;
		}
		putwchar( c );
	}

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

	return 0;
}

入力ファイル(test.txt)

あいうえお

実行結果(標準出力)

あいうえお
関連 マルチバイト文字版として EOFマクロが存在する。
解説章

wint_t

概要 ワイド文字型。
ヘッダ wctype.h、wchar.h
形式 typedef wchar_t wint_t;
詳細 wchar_t型の値と、WEOF を表現するために十分なサイズの整数型。
注意 この型の大きさは、環境によって異なる。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	printf("%lu\n", sizeof(wint_t));

	return 0;
}

実行結果 (VisualC++ 2013/2015/2017):

2

実行結果 (clang 3.7):

4
関連
解説章

wmemchr関数

概要 メモリ上から、特定のワイド文字を探す。
ヘッダ wchar.h
形式 wchar_t* wmemchr(const wchar_t* s, wchar_t c, size_t n);
引数 s 対象のメモリアドレス。
c 探す文字。
n 検索する文字数。
戻り値 発見された場合は、メモリ上の文字c のアドレス。
発見できなかった場合は NULL
詳細 アドレスs のから検索を行い、引数c と一致する文字を探す。
注意 検索対象のアドレスs は const であるのにも関わらず、戻り値は非const のポインタである。 そのため、const指定されている領域を対象にした場合、返されたポインタを経由して書き換えを行うことは未定義の動作である。
(C++ では、const指定の扱いが厳しくなっているため、この関数は const版と非const版にオーバーロードされていることがある)。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	const wchar_t str[] = L"abc\0def";
	const wchar_t* p;

	p = wmemchr( str, L'd', sizeof(str)/sizeof(str[0]) );
	if( p == NULL ){
		puts( "見つからない。" );
	}
	else{
		wprintf( L"%ls\n", p );
	}

	return 0;
}

実行結果:

def
関連 char型版の memchr関数がある。
また、文字列からの検索に特化した wcschr関数がある。
解説章

wmemcmp関数

概要 2つのアドレスを起点に、それぞれ指定サイズ分のデータを比較する。
ヘッダ wchar.h
形式 wchar_t* wmemcmp(const wchar_t* s1, const wchar_t* s2, size_t size);
引数 s1 比較対象の先頭アドレス。
s2 比較対象の先頭アドレス。
size 比較する文字数。
戻り値 辞書順で s1 の方が小さければ(前に来れば) 0 より小さい値が、
s1 の方が大きければ(後に来れば) 0 より大きい値が、
s1 と s2 が同じであれば 0 が返される。
詳細 2つの起点アドレスを元に、一定の文字数の範囲を比較する。
終端文字(L'\0') で終了しない点を除けば、処理内容は wcscmp関数と変わらない。
注意 構造体のメンバ間には、コンパイラによって、パディング(詰め物)が挿入される可能性があるので、 構造体変数同士を比較するような目的で、この関数を使用することは間違いである。 構造体変数同士の比較は、各メンバを個別に ==演算子で調べるのが正しい。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s1[] = L"abc\0de";
	wchar_t s2[] = L"ab\0c";
	wchar_t s3[] = L"abcdef";

	wprintf( L"%d\n", wmemcmp(s1, s1, sizeof(s1)) );
	wprintf( L"%d\n", wmemcmp(s1, s2, sizeof(s1)) );
	wprintf( L"%d\n", wmemcmp(s1, s3, sizeof(s1)) );

	return 0;
}

実行結果:

0
1
-1
関連 char型版の memcmp関数が存在する。
適切に終端文字(L'\0') が存在し、途中に登場することも無い、ごく普通の文字列同士の比較であれば、 wcscmp関数を使えば良い。
解説章

wmemcpy関数

概要 あるアドレスを起点に、一定のサイズのデータを、別のアドレスへコピーする。
ヘッダ wchar.h
形式 wchar_t* wmemcpy(wchar_t* s1, const wchar_t* s2, size_t size);
引数 s1 コピー先の先頭アドレス。
s2 コピー元の先頭アドレス。
size コピーする文字数。
戻り値 s1 と同じアドレスが返される。
詳細 wcscpy関数とは異なり、L'\0' の影響を受けない。
注意 コピー先の範囲と、コピー元の範囲が重なり合っている場合の結果は未定義である。 重なり合う場合には、wmemmove関数を使えば良い。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s1[] = L"abcdefg";
	wchar_t s2[] = L"xyz";

	wprintf( L"%ls\n", wmemcpy( s1, s2, sizeof(s2)/sizeof(s2[0])-1 ) );

	return 0;
}

実行結果:

xyzdefg
関連 char型版の memcpy関数が存在する。
コピー先範囲とコピー元範囲が重なり合う場合は、wmemmove関数を使う。 文字列のコピーならば、wcscpy関数wcsncpy関数が使える。
解説章

wmemmove関数

概要 あるアドレスを起点に、一定のサイズのデータを、別のアドレスへコピーする。
ヘッダ wchar.h
形式 wchar_t* wmemmove(wchar_t* s1, const wchar_t* s2, size_t size);
引数 s1 コピー先の先頭アドレス。
s2 コピー元の先頭アドレス。
size コピーする文字数。
戻り値 s1 と同じアドレスが返される。
詳細 wcscpy関数とは異なり、L'\0' の影響を受けない。
wmemcpy関数とは異なり、コピー先範囲とコピー元範囲が重複していても動作する。 wmemmove関数の方が安全だが、通常、wmemcpy関数の方が高速なはずである。
注意
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s1[] = L"abcdefg";

	wprintf( L"%ls\n", wmemmove( &s1[0], &s1[3], 4 ) );

	return 0;
}

実行結果:

defgefg
関連 char型版の memmove関数が存在する。
コピー先範囲とコピー元範囲が重なり合わない場合は、wmemcpy関数が使える。 文字列のコピーならば、wcscpy関数wcsncpy関数が使える。
解説章

wmemset関数

概要 あるアドレスを起点に、一定の範囲の各バイトに、特定の値を設定する。
ヘッダ wchar.h
形式 wchar_t* wmemset(wchar_t* s, wchar_t c, size_t size);
引数 s 設定先の先頭アドレス。
c 設定する値(文字)
size 設定する文字数。
戻り値 s と同じアドレスが返される。
詳細 引数c の値が、指定範囲内のすべての領域に設定される。
注意
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	wchar_t s1[] = L"abcdefg";

	wprintf( L"%ls\n", wmemset( s1, L'x', 5 ) );

	return 0;
}

実行結果:

xxxxxfg
関連 char型版の memset関数が存在する。
解説章

wprintf関数

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

int main(void)
{
	wprintf( L"%d %3d %03d\n", 10, 10, 10 );

	return 0;
}

実行結果

10  10 010
関連 マルチバイト文字版は printf関数である。
引数... の代わりに、va_list を用いたバージョンとして、vwprintf関数がある。
解説章

wscanf関数

概要 標準入力から、フォーマット指定付きでワイド文字列を受け取る。
ヘッダ wchar.h
形式 int wscanf(const wchar_t* format, ...);
引数 format フォーマット指定文字列。
... 入力された値を受け取るアドレスの指定。 format に含まれているフォーマット指定子に対応した個数と型であること。
戻り値 エラーが発生した場合には EOF を返す。 その他の場合には、正常に値の代入を行えた個数を返す。
詳細 wchar_t型を使うことを除き、scanf関数と同様であり、同じ機能を持つ。
注意 必要な個数の実引数が指定されていない場合の動作は未定義だが、 余分に指定されている場合には、評価は行われるが、wscanf関数としては無視する。
使用例
#include <stdio.h>
#include <wchar.h>

int main(void)
{
	int num;

	wscanf( L"%d", &num );
	printf( "%d\n", num );

	return 0;
}

実行結果:

123
123
関連 char型を使う scanf関数がある。
解説章

参考リンク

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

更新履歴

'2017/5/23 wcsftime関数の説明を追加。

'2017/5/16 wcstombs関数の説明を追加。

'2017/5/12 wctomb関数の説明を追加。

'2017/4/12 wprintf関数の説明を追加。

'2017/4/10 WEOF、wint_t の説明を追加。

'2017/4/9 wchar_t の説明を追加。

'2017/3/9 wscanf関数の戻り値の説明を修正。

'2015/9/5 VisualC++ 2012 の対応終了。

'2015/8/18 VisualC++ 2010 の対応終了。

'2015/8/15 wcstok関数を VisualC++ 2015 で確認。
wcstok関数の使用例を修正。

'2014/2/1 wcstok関数を VisualC++ 2013 で確認。

'2012/9/17 wcstok関数を VisualC++ 2012 で確認。

'2011/7/27 wmemchr関数、wmemcmp関数、wmemcpy関数、wmemmove関数、wmemset関数の説明を追加。

'2011/7/24 wscanf関数の説明を追加。

'2011/6/4 wcstok関数の説明を追加。

'2011/5/14 wcschr関数、wcsrchr関数、wcsstr関数の説明を追加。

'2011/3/20 wcsncat関数、wcsncmp関数、wcsncpy関数の説明を追加。

'2011/2/5 wcscat関数、wcscmp関数、wcscpy関数、wcslen関数の説明を追加。

'2009/8/20 新規作成。



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

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

Programming Place Plus のトップページへ