文字列操作関数1

ウィンドウアプリケーションでもC言語の文字列操作関数を使用することはできますが、Windows APIにも基本的な文字列操作関数が用意されています。
他のOSに移植しない、Windows専用アプリの開発ならこれらを利用することができます。
(TCHAR型にも対応しています)

文字列操作関数は大量にあるため、ここでは一部を紹介します。

C言語と同等の文字列操作関数

Windows APIにはC言語標準関数と同等の文字列操作関数が用意されています。

これらの関数は現在の文字セットに合わせてマルチバイト文字版とワイド文字版を適切に呼び出してくれます。
引数の型も「LPWSTR」などWin32用になっています。
(→三種類の同名関数も参照)

基本関数

Win32API関数 C標準関数 説明
lstrlen strlen 文字列の文字数を返す
(NULL文字は含まない)
lstrcpy
lstrcpyn
strcpy
strncpy
文字列をコピーする
lstrcat strcat 文字列を結合する
lstrcmp
lstrcmpi
strcmp
strcmpi
文字列を比較する
wsprintf sprintf 書式指定文字列を使用して文字列を整形する

動作はC言語標準関数と同じですが、lstrlen関数とlstrcmp関数(lstrcmpi関数)以外はバッファオーバーランの危険性があるため非推奨関数です。

strcmpi関数は大文字小文字を無視して比較する関数です。
これはC標準関数ではありませんが、多くのコンパイラがサポートしています。

Char、Str系

文字列を変換する関数は引数に指定した文字列自体が書き換えられます。
つまり、文字列リテラルを渡すとエラーになります。
(文字列リテラルは書き換えられない)

Win32API関数 C標準関数 説明
CharLower tolower

文字を小文字に変換する
戻り値は処理した文字

CharLower関数は文字列も指定できる
この場合の戻り値は文字列のポインタ

CharUpper toupper

文字を大文字に変換する
戻り値は処理した文字

CharUpper関数は文字列も指定できる
この場合の戻り値は文字列のポインタ

CharLowerBuff (なし)

第一引数の文字列を小文字に変換する
第二引数に処理する文字数を指定
戻り値は処理した文字数

第一引数の文字列にNULL文字が出現しても無視し、第二引数で指定した文字数分の置き換えを行う

CharUpperBuff (なし)

第一引数の文字列を大文字に変換する
第二引数に処理する文字数を指定
戻り値は処理した文字数

第一引数の文字列にNULL文字が出現しても無視し、第二引数で指定した文字数分の置き換えを行う

IsCharLower islower 文字が小文字ならTRUEを返す
そうでないならFALSEを返す
IsCharUpper isupper 文字が大文字ならTRUEを返す
そうでないならFALSEを返す
IsCharAlpha isalpha 文字がアルファベットならTRUEを返す
そうでないならFALSEを返す
IsCharAlphaNumeric isalnum 文字が英数字ならTRUEを返す
そうでないならFALSEを返す
StrChr strchr 第一引数の文字列から第二引数の文字を検索し、その位置のポインタ返す
StrChrN (なし) 第一引数の文字列から第二引数の文字を検索し、その位置のポインタ返す
第三引数には検索する最大文字数を指定する
StrChrI (なし) 第一引数の文字列から第二引数の文字を検索し、その位置のポインタ返す
大文字小文字を区別しない
StrChrNI (なし) 第一引数の文字列から第二引数の文字を検索し、その位置のポインタ返す
第三引数には検索する最大文字数を指定する
大文字小文字を区別しない
StrRChr (strrchr) 第一引数の文字列の終端から前方に向かって、第二引数で指定する文字ポインタまで、第三引数の文字を検索し、その位置のポインタを返す
第二引数にNULLを指定すると文字列全体を検索する
StrRChrI (なし) 第一引数の文字列の終端から前方に向かって、第二引数で指定する文字ポインタまで、第三引数の文字を検索し、その位置のポインタを返す
第二引数にNULLを指定すると文字列全体を検索する
大文字小文字を区別しない
StrStr strstr 第一引数の文字列から第二引数の文字列を検索し、その位置のポインタ返す
StrStrN (なし) 第一引数の文字列から第二引数の文字列を検索し、その位置のポインタ返す
第三引数には検索する最大文字数を指定する
StrStrI (なし) 第一引数の文字列から第二引数の文字列を検索し、その位置のポインタ返す
大文字小文字を区別しない
StrStrNI (なし) 第一引数の文字列から第二引数の文字列を検索し、その位置のポインタ返す
第三引数には検索する最大文字数を指定する
大文字小文字を区別しない
StrRStrI (なし) 第一引数の文字列の終端から前方に向かって、第二引数で指定する文字ポインタまで、第三引数の文字列を検索し、その位置のポインタを返す
第二引数にNULLを指定すると文字列全体を検索する
大文字小文字を区別しない
StrSpn strspn 第一引数の文字列の先頭から、第二引数の文字列内のいずれかの文字が連続して出現する文字数を取得する
StrCSpn strcspn 第一引数の文字列の先頭から、第二引数の文字列内のいずれでもない文字が連続して出現する文字数を取得する
StrCSpnI (なし) 第一引数の文字列の先頭から、第二引数の文字列内のいずれかの文字が連続して出現する文字数を取得する
大文字小文字を区別しない

数値に変換

C言語では、文字列を数値に変換するにはatoi関数strtol関数などを使用します。
Win32API関数ではStrToInt関数、StrToIntEx関数、StrToInt64Ex関数を使用します。
これらの関数の使用にはshlwapi.hのインクルードおよびshlwapi.libへのリンクが必要です。

int StrToIntW(
 PCWSTR pszSrc
);
文字列pszSrcを10進数文字列と解釈し、数値に変換して返す。
(atoi関数と同等の動作)
BOOL StrToIntExW(
 PCWSTR pszString,
 STIF_FLAGS dwFlags,
 int *piRet
);
文字列pszStringを数値に変換しint型ポインタ変数piRetに格納する。
フラグdwFlagsで10進数/16進数を指定できる。
成功した場合はTRUEを、失敗した場合はFALSEを返す。
BOOL StrToInt64ExW(
 PCWSTR pszString,
 STIF_FLAGS dwFlags,
 LONGLONG *pllRet
);
文字列pszStringを数値に変換しLONGLONG型ポインタ変数pllRetに格納する。
フラグdwFlagsで10進数/16進数を指定できる。
成功した場合はTRUEを、失敗した場合はFALSEを返す。

StrToInt関数の動作はC言語のatoi関数と同じです。

StrToIntEx関数、StrToInt64Ex関数は変換した数値を第三引数に格納します。
この二つの関数の違いは得られる数値のデータ型だけです。
第二引数には以下の定数のいずれかが指定できます。

定数 説明
STIF_DEFAULT 文字列を10進数として解釈する
STIF_SUPPORT_HEX 文字列を10進数または16進数として解釈する

STIF_SUPPORT_HEXフラグは文字列の先頭に「0x」または「0X」がある場合に16進数文字列として解釈します。
それ以外は10進数文字列として解釈します。
16進数文字列ではA~Fまたはa~fは数値として解釈されます。
先頭にマイナスを付けることは可能ですが無視されます。


#include <windows.h>
#include <shlwapi.h>

//shlwapi.libのリンク
#pragma comment(lib, "shlwapi.lib")

//途中省略

int num;

//123
num = StrToInt(L"123");
//-123
num = StrToInt(L"-123");
//12
num = StrToInt(L"12a3");
//0
num = StrToInt(L"a123");

//123
StrToIntEx(L"123", STIF_DEFAULT, &num);
//12
StrToIntEx(L"12a3", STIF_DEFAULT, &num);
//0
StrToIntEx(L"0x12a", STIF_DEFAULT, &num);

//-12
StrToIntEx(L"-12a3", STIF_SUPPORT_HEX, &num);
//298
StrToIntEx(L"0x12a", STIF_SUPPORT_HEX, &num);
//298
StrToIntEx(L"-0x12a", STIF_SUPPORT_HEX, &num);