文字列操作関数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 |
文字を小文字に変換する
|
CharUpper | toupper |
文字を大文字に変換する
|
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);