ワイドと2.2 C言語
2.2.2より広範な文字
C言語のワイド文字が短い型データに基づいて、このデータタイプは、ヘッダファイルのプロトタイプがwchar.hで定義されているからです。
符号なしshortのwchar_tのtypedef。
符号なしの短整数、符号なしの短いC言語とそのためのwchar_tワイド文字データ型、16ビット幅です。
例えば:
wchar_tのC = ' A '。
お使いのコンピュータに保存され、0x0041である0×41 0×00として表示されます
2.2.3ワイド文字ライブラリ関数
strlen関数を計算するワイド文字の長さを使用している場合:
する#include <stdio.hに> する#include < 文字列・H> int型のmain() { wchar_tの * P = L " こんにちは" 。 printf(" %Dを\ n " strlenを、(P))。リターン0 ; }
結果は、ワイド文字列が「こんにちは」メモリに保存されている期間の値は、次のようにするので、これは、1つの実行された後、明らかに、それが正しい長さを取得していないことを示しています。
48 00 65 00 00 6C 6C 6F 00 00 21 00
strlen文字列の最初の0:00の文字列が終了したと考えられるので、長さは、このいずれかをカウントするためにstrlenを、1として得られた見つけたときに「H」表現0x48の文字があるためです。
私たちは、たwcslenワイド文字の長さの計算機能を使用しています。同じこと
関数名 |
関数原型 |
機能機能 |
返却値 |
wcscat |
wchar_t型* wcscat(wchar_t型の* s1を、CONSTはwchar_t * S2)。 |
接続文字列s1をs2は、後に参照しました |
文字列s1の最初のアドレスを参照 |
wcschr |
wchar_t型* wcschr(CONSTのwchar_t *は、wchar_t型のC)。 |
文字列s中に文字cの最初の出現を検索します |
見つかった場合、文字のアドレスが返され、そうでない場合はNULL |
wcscmpの |
int型wcscmpの(のconst wchar_t型の* s1を、CONSTはwchar_t * S2)。 |
文字列と比較して、文字列s1のS2をしてみましょう |
S1 <S2、負戻り、S1 == S2、0を返し、S1> S2と、正の数を返します |
wcscpy |
wchar_t型* wcscpy(wchar_t型の* s1を、CONSTはwchar_t * S2)。 |
S1内の文字列と呼ばs2のカバーをコピーします。 |
まず、アドレス文字列はS1と呼ば |
たwcslen |
size_tのたwcslen(のconst wchar_t型の*秒)。 |
S要件呼ば文字列の長さ |
有効な文字の数を返します。 |
wcsstr |
wchar_t型* wcsstr(のconst wchar_t型の* s1を、CONSTはwchar_t * S2)。 |
s2の最初の出現s1の文字列内の文字列の位置を探します |
見つかった場合は、場所のアドレスが返され、そうでない場合はNULLを返します |
2.2.4ソースコードファイルを維持します
「こんにちは」Lを使用してテキスト回避を使用して直接TEXT(「こんにちは」)
場所のTEXT回顧定義はLを追加することが見出されました
#define TEXT(引用)__TEXT(引用) // r_winnt の#define __TEXT(引用)L ##引用 // r_winnt
そのため、TEXTを使用するか、_TEXTはLに感謝することはできません
2.3ワイドおよびWindows
2.3.1 Windowsのヘッダファイルを入力
Windowsプログラムは、ヘッダーファイルWINDOWS.Hが含まれています。文書は、ファイルがWindowsの定義で使用される基本的なパターンの数を有し、WINDEF.H含む他のヘッダファイルの数を含み、それはWINNT.Hを含んでも、それ自体です。WINNT.Hは、基本的なUnicodeサポートを扱います。
wchar_t型の定義を含む多くのCヘッダファイルの一つであるフロントヘッダのctype.hテーブルCを含むWINNT.H。WINNT.HはCHARとWCHARと呼ばれる、新しいデータ型を定義します。
typedefのchar型のCHAR; typedefのwchar_t WCHAR。 // トイレ
あなたは8文字または16個の文字を定義する必要がある場合、あなたがWindowsプログラムで使用して、データ型がCHAR WCHARあることをお勧めします。ハンガリー語の表記の後ろに定義WCHARコメントが推奨される:可変基づいWCHARデータパターンは、ワイド文字WCを示すために、文字の前に取り付けられてもよいです。
さらにWINNT.Hヘッダファイルは、文字列データ型に4つの8のconstポインタとして使用される8および6つのデータパターンとして使用する文字列へのポインタを定義します。ここでは、ヘッダの選択は、いくつかの実用的な説明データ・タイプのステートメントをファイル:
CHAR * PCHAR、* LPCH、* PCH、* NPSTR、* LPSTR、*のtypedef PSTR。
typedefのCONST CHAR * LPCCH、* PCCH、* LPCSTR、* PCSTR。
NとLは、2つのサイズで16ビットのWindows異なる指標を参照すると、「近い」と「長い」接頭辞を表します。Win32の近くと長い指数の違いはありません。
同様に、WINNT.HはCONSTとして、文字列データ型に6つの16ビット・ポインタ、および文字列データ型に4つの16ビットポインタとして定義されます。
typedef WCHAR * PWCHAR、* LPWCH、* PWCH、* NWPSTR、* LPWSTR、* PWSTR。
typedefのCONST WCHAR * LPCWCH、* PCWCH、* LPCWSTR、* PCWSTR。
この時点で、我々は、CHARとWCHARインジケータにデータタイプCHAR(8ビット文字)とWCHAR(16ビットのwchar_t)、及び点を有します。TCHAR.Hと同じように、WINNT.H TCHARは、一般的な文字タイプとして定義されます。UNICODE定義識別子(ないボトムライン)、およびTCHARを指すTCHARインジケータはWCHARの指標として定義され、WCHARを向いている場合、UNICODE識別子が定義されていない場合、およびTCHAR TCHARインデックスの点は、を指すように、及びチャーのように定義されますchar型の指標:
#ifdefのUNICODE WCHAR TCHAR typedefは、 * PTCHAR。 LPWSTR LPTCH、PTCH、PTSTR、LPTSTRのtypedef。 LPCWSTR LPCTSTRのtypedef。 #elseの typedefの文字 TCHAR * PTCHAR。 LPSTR LPTCH、PTCH、PTSTR、LPTSTRのtypedef。 LPCSTR LPCTSTRのtypedef。 #endifの
あなたは、ヘッダーファイル、または他のヘッダファイルにTCHARデータ型を定義した場合、その後、WINNT.Hとプロトタイプがwchar.hヘッダファイルには、その繰り返しを防ぐために定義することができます。しかし、いつでもプログラムの他のヘッダファイルの使用は、他のWINDOWS.Hヘッダーファイルの前に含めるべきです。
WINNT.Hヘッダーファイルは、また、最初のL-引用符で囲まれた文字列の前に追加のマクロを定義します。UNICODEが定義された識別子である場合は、次のように定義されたマクロ__TEXTと呼ばれています。
#define __TEXT(引用)L ##引用
__TEXTマクロの定義のように、識別子UNICODEが定義されていない場合:
#define __TEXT(引用)引用
さらに、TEXTマクロは、このように定義されます:
#define TEXT(引用)__TEXT(引用)
この方法TCHAR.H _TEXTマクロは同じに定義されていますが、一番下の行を心配する必要はありません。私は本のこのマクロテキストバージョンを使用します。
これらの定義は、同じプログラム内でASCIIとUnicode文字列を混在できるように、またはコンパイルされたプログラムのASCIIまたはUnicodeで書かれていてもよいです。あなたが明示的に8ビットの文字変数と文字列を定義したい場合は、CHAR、PCHAR(またはその他)を使用するだけでなく、引用符で囲まれた文字列。明示的に16ビットの文字変数と文字列を使用するには、WCHAR、PWCHAR、およびLは、引用符の前に追加します。8ビットまたは16ビットの変数またはTCHAR、PTCHARおよびテキストマクロを使用する識別子UNICODE文字列の定義に応じました。
2.3.2 Windows関数の呼び出し
MessageBoxA:
WINUSERAPIのINT WINAPI MessageBoxA(HWND hWndは、LPCSTR lpText、 LPCSTR lpCaption、UINT uType)。
ここMessageBoxWは以下のとおりです。
WINUSERAPI INT WINAPI MessageBoxW(HWND hWndは、LPCWSTR lpText、 LPCWSTR lpCaption、UINT uType)。
彼らの第二と第三引数は文字列定数ポインタです
メッセージボックスには、パラメータの種類に応じて呼び出されます。
UNICODEの#ifdef の#defineのMessageBox MessageBoxW の#else の#defineのMessageBox MessageBoxA #endifの // !UNICODE
2.3.3 Windowsの文字列関数
以下は、Windowsによって定義された文字列関数の集合であり、これらの関数は、文字列の長さを計算する文字列をコピーし、接続文字列と比較文字列に使用されます。
さilength = lstrlen(pString)。 pString = lstrcpy(pString1、pString2)。 pString = lstrcpyn(pString1、pString2、ICOUNT)。 pString = lstrcat(pString1、pString2)。 ICOMP = lstrcmpを(pString1、pString2)。 ICOMP = LSTRCMPI(pString1、pString2)。
これらの機能は、対応するC関数リンクライブラリ関数と同じです。UNICODE識別子が定義されている場合、その関数は、ワイド文字列を受け入れる、または唯一の従来の文字列を受け入れます。機能のLstrlenWワイド文字列バージョンは、Windows 98で実行することができます。
Windowsでの2.3.4の使用のprintf
あなたは、Windowsプログラムでprintf関数を使用しますが、他の機能を利用することはできません。
#include <はWindows.h> する#include <stdio.hに> する#include <STDLIB.H> INT WINAPIのWinMain(HINSTANCE hInstanceは、HINSTANCE hPrevInstance、PSTR szCmdLine、INT iCmdShow) { チャー szBuffer [ 100 ]。 sprintf(szBuffer、" %の合計iと%iはiがn \%である"、5、3、5 + 3 )。 メッセージボックス(NULL、szBuffer、TEXT(" Hk_Mayfly ")、0x4L | 0x40L )。リターン0 ; }
次の表は、すべてのsprintf関数のMicrosoft CランタイムライブラリとWindowsのサポートを示しています。
ASCII |
ワイド文字 |
従来の |
|
可変パラメータの数 |
|||
スタンダード版 |
sprintf |
swprintf |
_stprintf |
最大の長さのバージョン |
_snprintf |
_snwprintf |
_sntprintf |
Windows版 |
wsprintfA |
wsprintfW |
wsprintf |
ポインタパラメータ配列 |
|||
スタンダード版 |
vsprintfの |
vswprintf |
_vstprintf |
最大の長さのバージョン |
_vsnprintf |
_vsnwprintf |
_vsntprintf |
Windows版 |
wvsprintfA |
wvsprintfW |
wvsprintf |
2.3.5フォーマットされたメッセージボックス
#include <windows.h> #include <tchar.h> #include <stdio.h> int CDECL MessageBoxPrintf (TCHAR * szCaption, TCHAR * szFormat, ...) { TCHAR szBuffer [1024] ; va_list pArgList ; // The va_start macro (defined in STDARG.H) is usually equivalent to: // pArgList = (char *) &szFormat + sizeof (szFormat) ; va_start (pArgList, szFormat) ; // The last argument to wvsprintf points to the arguments _vsntprintf ( szBuffer, sizeof (szBuffer) / sizeof (TCHAR), szFormat, pArgList) ; // The va_end macro just zeroes out pArgList for no good reason va_end (pArgList) ; return MessageBox (NULL, szBuffer, szCaption, 0) ; } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int cxScreen, cyScreen ; cxScreen = GetSystemMetrics (SM_CXSCREEN) ; cyScreen = GetSystemMetrics (SM_CYSCREEN) ; MessageBoxPrintf ( TEXT ("ScrnSize"), TEXT ("The screen is %i pixels wide by %i pixels high."), cxScreen, cyScreen) ; return 0 ; }