C 文字列操作 新しいページはコチラ
提供: yonewiki
22行: | 22行: | ||
<br /> | <br /> | ||
成長云々の件はここでは関係ありませんので、置いておくとして、文字列の操作をひとつづつやってみましょう。(書きかけの記事です。最終更新131128)<br /> | 成長云々の件はここでは関係ありませんので、置いておくとして、文字列の操作をひとつづつやってみましょう。(書きかけの記事です。最終更新131128)<br /> | ||
− | *文字列長取得 | + | 文字列操作に関する関数は以下のアドレスのとおりです。<br /> |
+ | http://msdn.microsoft.com/ja-jp/library/f0151s4x.aspx<br /> | ||
+ | 上記があれば、自分が説明する必要はもうないかなと思うわけですが、一応、自分なりに。<br /> | ||
+ | *'''文字列長取得'''<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/78zh94ax.aspx<br /> | ||
+ | http://msdn.microsoft.com/ja-jp/library/z50ty2zh.aspx<br /> | ||
+ | _tcslen(TCHA型設定時)/wcslen(Unicode設定)/strlen(マルチバイト設定)<br /> | ||
+ | マルチバイト設定時の日本語対応関数 _mbslenになります。第一引数がNULLのとき、アクセス違反が発生します。<br /> | ||
+ | <br /> | ||
+ | lenの前にnが付くものは第二引数に最大文字数を設定する必要があり、文字列がそれを超えた場合は最大文字数を返します。<br /> | ||
+ | _tcsnlen(TCHA型設定時)/wcsnlen(Unicode設定)/strnlen(マルチバイト設定) サフィックスに_sが付く関数では、第一引数がNULLときは戻り値が0になります。<br /> | ||
+ | マルチバイト設定時の日本語対応関数 _mbsnlen<br /> | ||
+ | <br /> | ||
+ | _mbstrlenおよび_mbstrnlen は無効なマルチバイトを含む場合に戻り値-1を返します。<br /> | ||
+ | _mbstrnlen は最大文字を超えると例外処理が発生し戻り値に-1とするとともにEINVAL に errnoを格納します。<br /> | ||
+ | 更にサフィックスに_lが付くものは最後の引数として、ロケール設定ができます。ロケール設定の無い関数はsetlocale関数で設定された値に従います。<br /> | ||
+ | <br /> | ||
+ | 全部で<br /> | ||
+ | strlen、strlen_l、wcslen、wcslen_l、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_l , strnlen、strnlen_s、strnlen_l、wcsnlen、wcsnlen_s、wcsnlen_l、_mbsnlen、_mbsnlen_l、_mbstrnlen、_mbstrnlen_l <br /> | ||
+ | これだけの種類があります。<br /> | ||
+ | <br /> | ||
+ | 要するに?<br /> | ||
+ | _tcslenを使うのが良いでしょう。Locale設定はあらかじめ実施しておくのが良いと思います。strnlen_sやwcsnlen_sはNULLの文字列の場合に0を返してくれるのはなんか良さげですが、<br /> | ||
+ | 文字列の終端が必ず\0で終わっていさえすれば必要のないことです。それはヌル文字でもいいわけです。アドレスがヌルのヌルポインターのときにプログラムが止まるよって言ってます。<br /> | ||
+ | なんか、いっぱいありすぎて迷うけど…。_tcslen!<br /> | ||
+ | _lが付く関数は個別にLocale変換が必要な場合にのみ使えば良いでしょう。_tcsnlenで最大文字数を設定するのは、一見安全そうですが、なんか無駄なような気がします。<br /> | ||
+ | あきらかに最大文字数がわかるような場合には、なんか入れておいて_tcsnlen_sってのはいい選択肢だと思います。<br /> | ||
+ | <br /> | ||
+ | <syntaxhighlight lang="cpp" line start="1"> | ||
+ | #include <tchar.h> | ||
+ | int main() { | ||
+ | _tsetlocale(LC_ALL, _T("Japanese")); | ||
+ | const TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | ||
+ | TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)]; | ||
+ | for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | ||
+ | _tprintf(_T("%2d/%2d:cStr0[%2d]=%s\nStrCount=%d\n\n"),i, sizeof(cStr0)/sizeof(*cStr0),i, cStr0[i],_tcslen(cStr0[i])); | ||
+ | } | ||
+ | } | ||
+ | </syntaxhighlight> | ||
+ | 出力結果 | ||
+ | <syntaxhighlight lang="cpp"> | ||
+ | 0/ 3:cStr0[ 0]=表示:よねウィキの機能<yonewiki> | ||
+ | StrCount=21 | ||
+ | |||
+ | 1/ 3:cStr0[ 1]=表示:よねウィキの機能1<yonewiki> | ||
+ | StrCount=22 | ||
+ | |||
+ | 2/ 3:cStr0[ 2]=表示:よねウィキの機能2<yonewiki> | ||
+ | StrCount=22 | ||
+ | </syntaxhighlight> | ||
*コピー | *コピー | ||
*連結 | *連結 | ||
29行: | 78行: | ||
*区切り文字分割 | *区切り文字分割 | ||
*探索 | *探索 | ||
− | *正規表現 | + | *正規表現 regex_match |
*文字列の型変換 | *文字列の型変換 | ||
*文字コード変換 | *文字コード変換 |