前へ | 次へ | 目次 | 索引 |
wstr1 がポイントする文字列の中で, wstr2 がポイントする文字列に含まれるワイド文字のシーケンスの最初のオカレンスを探します。
#include <wchar.h>関数バリアント wcswcs関数は,それぞれ 32 ビットと 64 ビットのポインタ・サイズで使用するための _wcswcs32と _wcswcs64という名前のバリアントを持っています。ポインタ・サイズ固有の関数の使用方法については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。wchar_t *wcswcs (const wchar_t *wstr1, const wchar_t*wstr2);
wstr1, wstr2
null で終了するワイド文字列へのポインタ。
ポインタ 発見されたワイド文字列へのポインタ。 NULL ワイド文字列が発見されなかったことを示します。
#include <stdlib.h> #include <stdio.h> #include <wchar.h> /* This test uses wcswcs() to find the occurrence of each */ /* subwide-character string, string1 and string2, within */ /* the main wide-character string, lookin. */ #define BUF_SIZE 50 main() { static char lookin[] = "that this is a test was at the end"; char string1[] = "this", string2[] = "the end"; wchar_t buffer[BUF_SIZE], input_buffer[BUF_SIZE]; /* Convert lookin to wide-character format. */ /* Buffer and print it out. */ if (mbstowcs(buffer, lookin, BUF_SIZE) == (size_t)-1) { perror("mbstowcs"); exit(EXIT_FAILURE); } printf("Buffer to look in: %S\n", buffer); /* Convert string1 to wide-character format and use */ /* wcswcs() to locate it within buffer */ if (mbstowcs(input_buffer, string1, BUF_SIZE) == (size_t)-1) { perror("mbstowcs"); exit(EXIT_FAILURE); } printf("this: %S\n", wcswcs(buffer, input_buffer)); /* Convert string2 to wide-character format and use */ /* wcswcs() to locate it within buffer */ if (mbstowcs(input_buffer, string2, BUF_SIZE) == (size_t)-1) { perror("mbstowcs"); exit(EXIT_FAILURE); } printf("the end: %S\n", wcswcs(buffer, input_buffer)); exit(1); }
この例のプログラムを実行すると,次の結果が生成されます。
Buffer to look in: that this is a test was at the end this: this is a test was at the end the end: the end |
ディスプレイ・デバイス上の,ワイド文字列の表示に必要なプリント位置の数を決定します。
#include <wchar.h>int wcswidth (const wchar_t *pwcs, size_t n);
pwcs
ワイド文字列へのポインタ。n
文字列の中の文字数の最大値。
wcswidth関数は, pwcs がポイントする文字列の最初の n 文字を表示するために必要なプリント位置の数を返します。文字列に含まれるワイド文字が n 個未満の場合,関数は文字列全体に必要な位置の数を返します。
x 必要なプリント位置の数。 0 pwcs は null 文字です。 - 1 pwcs がポイントする文字列の中の 1 つ (またはそれ以上) のワイド文字が,プリント可能な文字でないことを示します。
ワイド文字列を変更して,変更後の文字列を wcscmp関数に渡したときに,変更なしの文字列を wcscoll関数に渡したときと同じ結果が得られるようにします。
#include <wchar.h>size_t wcsxfrm (wchar_t *ws1, const wchar_t *ws2, size_t maxchar);
ws1, ws2
ワイド文字列へのポインタ。maxchar
s1 に格納できるワイド文字の数の最大値。終端の null ワイド文字を含みます。
wcsxfrm関数は,ws2 がポイントする文字列を変換し,その結果の文字列を ws1 がポイントする配列に格納します。 ws1 がポイントする配列に格納されるワイド文字の数は,終端の null ワイド文字を含めて,maxchar 個以下です。maxchar の値が,( 終端の null を含めて ) 変換後の文字列を格納するのに必要なサイズよりも小さかった場合, ws1 がポイントする配列の内容は不定となります。この場合,関数は変換後の文字列のサイズを返します。
maxchar が 0 の場合, ws1 は NULL ポインタであってよく,関数は変換を行う前に, ws1 配列の必要なサイズを返します。
ワイド文字列比較関数の wcscollと wcscmpは,同じ 2 つのワイド文字列を与えられたときに,異なる結果を生成することがあります。これは, wcscmpが文字列中の文字のコード・ポイント値の直接の比較を行うのに対し, wcscollが比較の実行にロケール情報を使用するためです。ロケールによっては, wcscollの比較はマルチパスの操作になることがあり, wcscmpよりも遅くなります。
wcsxfrm関数は, wcscmp関数に 2 つの変換後の文字列を渡したときに,元の 2 つの文字列を wcscoll関数に渡したときと同じ結果が得られるような形でワイド文字列を変換します。 wcsxfrm関数は, wcscollを使って同じワイド文字列に対する多数の比較を行う必要があるアプリケーションで便利です。この場合には,( ロケールによっては ) wcsxfrm関数を使って文字列を変換した後に, wcscmp関数を使って比較を行う方が効率的である場合があります。
x 結果として得られる, ws1 がポイントする文字列の長さ。終端の null 文字は含みません。 ( size_t ) - 1 エラーが発生したことを示します。関数は errno を EINVAL に設定します。 ws2 がポイントする文字列は,照合シーケンスの領域の外にある文字を含みます。
#include <wchar.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> /* This program verifies that two transformed strings, */ /* when passed through wcsxfrm and then compared, provide */ /* the same result as if passed through wcscoll without */ /* any transformation. */ #define BUFF_SIZE 20 main() { wchar_t w_string1[BUFF_SIZE]; wchar_t w_string2[BUFF_SIZE]; wchar_t w_string3[BUFF_SIZE]; wchar_t w_string4[BUFF_SIZE]; int errno; int coll_result; int wcscmp_result; size_t wcsxfrm_result1; size_t wcsxfrm_result2; /* setlocale to French locale */ if (setlocale(LC_ALL, "fr_FR.ISO8859-1") == NULL) { perror("setlocale"); exit(EXIT_FAILURE); } /* Convert each of the strings into wide-character format. */ if (mbstowcs(w_string1, "<a`>bcd", BUFF_SIZE) == (size_t)-1) { perror("mbstowcs"); exit(EXIT_FAILURE); } if (mbstowcs(w_string2, "abcz", BUFF_SIZE) == (size_t)-1) { perror("mbstowcs"); exit(EXIT_FAILURE); } /* Collate string 1 and string 2 and store the result. */ errno = 0; coll_result = wcscoll(w_string1, w_string2); if (errno) { perror("wcscoll"); exit(EXIT_FAILURE); } else { /* Transform the strings (using wcsxfrm) into */ /* w_string3 and w_string4. */ wcsxfrm_result1 = wcsxfrm(w_string3, w_string1, BUFF_SIZE); if (wcsxfrm_result1 == ((size_t) - 1)) perror("wcsxfrm"); else if (wcsxfrm_result1 > BUFF_SIZE) { perror("\n** String is too long **\n"); exit(EXIT_FAILURE); } else { wcsxfrm_result2 = wcsxfrm(w_string4, w_string2, BUFF_SIZE); if (wcsxfrm_result2 == ((size_t) - 1)) { perror("wcsxfrm"); exit(EXIT_FAILURE); } else if (wcsxfrm_result2 > BUFF_SIZE) { perror("\n** String is too long **\n"); exit(EXIT_FAILURE); } /* Compare the two transformed strings and verify that */ /* the result is the same as the result from wcscoll on */ /* the original strings. */ else { wcscmp_result = wcscmp(w_string3, w_string4); if (wcscmp_result == 0 && (coll_result == 0)) { printf("\nReturn value from wcscoll() and return value" " from wcscmp() are both zero."); printf("\nThe program was successful\n\n"); } else if ((wcscmp_result < 0) && (coll_result < 0)) { printf("\nReturn value from wcscoll() and return value" " from wcscmp() are less than zero."); printf("\nThe program was successful\n\n"); } else if ((wcscmp_result > 0) && (coll_result > 0)) { printf("\nReturn value from wcscoll() and return value" " from wcscmp() are greater than zero."); printf("\nThe program was successful\n\n"); } else { printf("** Error **\n"); printf("\nReturn values are not of the same type"); } } } } }
この例のプログラムを実行すると,次の結果が生成されます。
Return value from wcscoll() and return value from wcscmp() are less than zero. The program was successful |
ワイド文字がシングルバイトのマルチバイト文字に対応するかどうかを判定し,そのマルチバイト文字表現を返します。
#include <stdio.h>#include <wchar.h>
int wctob (wint_t c);
c
シングルバイトのマルチバイト文字に変換するワイド文字。
wctob関数は,指定されたワイド文字が初期シフト状態にあるときにシングルバイトのマルチバイト文字に対応するかどうかを判定し,そうであればそのマルチバイト文字表現を返します。
x 指定されたワイド文字のシングルバイト表現。 EOF エラーを示します。指定されたワイド文字は,シングルバイトのマルチバイト文字に対応していません。
ワイド文字をマルチバイト文字表現に変換します。
#include <stdlib.h>int wctomb (char *s, wchar_t wchar);
s
結果として得られるマルチバイト文字へのポインタ。wchar
ワイド文字のコード。
wctomb関数は,wchar によって指定されたワイド文字を,そのマルチバイト文字表現に変換します。 s が NULL の場合には,0 が返されます。それ以外の場合には,マルチバイト文字を構成するバイト数が返されます。 s がポイントする配列オブジェクトには,最高で MB_CUR_MAX バイトが格納されます。この関数は,プログラムの現在のロケールの LC_CTYPE カテゴリの影響を受けます。
x wchar に対応するマルチバイト文字を構成するバイト数。 0 s は NULL です。 - 1 wchar は有効な文字ではありません。
後に towctransの呼び出しに使用できる,指定されたプロパティに対応するマッピングの記述を返します。
#include <wctype.h>wctrans_t wctrans (const char *property);
property
マッピングの名前。以下のプロパティ名は,すべてのロケールに対して定義されています。
- "toupper"
- "tolower"
現在のロケールの LC_CTYPE カテゴリに,その他のプロパティ名が定義されていることもあります。
wctrans関数は,property 引数によって識別されたワイド文字の間のマッピングを記述する, wctrans_t型の値を作成します。towctransも参照してください。
ゼロ以外 現在のプログラム・ロケールの LC_CTYPE カテゴリに従い, property 引数として指定された文字列は,既存の文字マッピングの名前です。返された値は, towctrans 関数の呼び出しに使用することができます。 0 エラーを示します。property 引数は,現在のプログラムのロケールの文字マッピングを識別していません。
文字クラスの定義に使用されます。この関数から返される値は, iswctype関数の呼び出しで使用されます。
#include <wctype.h> (ISO C)#include <wchar.h> (XPG4)
wctype_t wctype (const char *char_class);
char_class
有効な文字クラス名へのポインタ。
wctype関数は,現在のロケールに対して定義されている有効な文字クラスを, wctype_t型のオブジェクトに変換します。以下の文字クラスは,すべてのロケールに対して定義されています。
alnum cntrl lower space alpha digit print upper blank graph punct xdigit
現在のロケールの LC_CTYPE カテゴリに,その他の文字クラスが定義されていることもあります。
iswctypeも参照してください。
x iswctype 関数の呼び出しに使用できる wctype_t 型のオブジェクト。 0 文字クラス名が現在のロケールに対して有効ではありません。
#include <locale.h> #include <wchar.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <ctype.h> /* This test will set up a number of character class using wctype() */ /* and then verify whether calls to iswctype() using these classes */ /* produce the same results as calls to the is**** routines. */ main() { wchar_t w_char; wctype_t ret_val; char *character = "A"; /* Convert character to wide character format - w_char */ if (mbtowc(&w_char, character, 1) == -1) { perror("mbtowc"); exit(EXIT_FAILURE); } /* Check if results from iswalnum() matches check on */ /* alnum character class */ if ((iswalnum((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("alnum")))) printf("[%C] is a member of the character class alnum\n", w_char); else printf("[%C] is not a member of the character class alnum\n", w_char); /* Check if results from iswalpha() matches check on */ /* alpha character class */ if ((iswalpha((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("alpha")))) printf("[%C] is a member of the character class alpha\n", w_char); else printf("[%C] is not a member of the character class alpha\n", w_char); /* Check if results from iswcntrl() matches check on */ /* cntrl character class */ if ((iswcntrl((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("cntrl")))) printf("[%C] is a member of the character class cntrl\n", w_char); else printf("[%C] is not a member of the character class cntrl\n", w_char); /* Check if results from iswdigit() matches check on */ /* digit character class */ if ((iswdigit((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("digit")))) printf("[%C] is a member of the character class digit\n", w_char); else printf("[%C] is not a member of the character class digit\n", w_char); /* Check if results from iswgraph() matches check on */ /* graph character class */ if ((iswgraph((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("graph")))) printf("[%C] is a member of the character class graph\n", w_char); else printf("[%C] is not a member of the character class graph\n", w_char); /* Check if results from iswlower() matches check on */ /* lower character class */ if ((iswlower((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("lower")))) printf("[%C] is a member of the character class lower\n", w_char); else printf("[%C] is not a member of the character class lower\n", w_char); /* Check if results from iswprint() matches check on */ /* print character class */ if ((iswprint((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("print")))) printf("[%C] is a member of the character class print\n", w_char); else printf("[%C] is not a member of the character class print\n", w_char); /* Check if results from iswpunct() matches check on */ /* punct character class */ if ((iswpunct((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("punct")))) printf("[%C] is a member of the character class punct\n", w_char); else printf("[%C] is not a member of the character class punct\n", w_char); /* Check if results from iswspace() matches check on */ /* space character class */ if ((iswspace((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("space")))) printf("[%C] is a member of the character class space\n", w_char); else printf("[%C] is not a member of the character class space\n", w_char); /* Check if results from iswupper() matches check on */ /* upper character class */ if ((iswupper((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("upper")))) printf("[%C] is a member of the character class upper\n", w_char); else printf("[%C] is not a member of the character class upper\n", w_char); /* Check if results from iswxdigit() matches check on */ /* xdigit character class */ if ((iswxdigit((wint_t) w_char)) && (iswctype((wint_t) w_char, wctype("xdigit")))) printf("[%C] is a member of the character class xdigit\n", w_char); else printf("[%C] is not a member of the character class xdigit\n", w_char); }
この例のプログラムを実行すると,次の結果が生成されます。
[A] is a member of the character class alnum [A] is a member of the character class alpha [A] is not a member of the character class cntrl [A] is not a member of the character class digit [A] is a member of the character class graph [A] is not a member of the character class lower [A] is a member of the character class print [A] is not a member of the character class punct [A] is not a member of the character class space [A] is a member of the character class upper [A] is a member of the character class xdigit |
前へ | 次へ | 目次 | 索引 |