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
 
*文字列の型変換
 
*文字列の型変換
 
*文字コード変換
 
*文字コード変換

2013年11月29日 (金) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス