C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列操作) |
(→文字列長取得) |
||
21行: | 21行: | ||
=='''文字列長取得'''== | =='''文字列長取得'''== | ||
− | + | 文字列の長さを知りたいと思うことは、日常ではほとんどないですが、プログラムでは必要になるパターンが多いです。例えば、どれくらいのメモリサイズを確保すれば、いいのか?とか、文字列から抜き出した文字数が長い場合にはスクロールバーをつけたりとか、文字列の長さによって処理を分岐させたりすることもあります。この他、C言語においては、ほとんどの文字列操作関数で、その操作する文字列変数の文字列の長さを引数として与えなければならなかったりと、文字列操作の中でも基本中の基本となる部分です。知能指数の低い自分は文字数の足し算、引き算で間違えたりすることも多いです。うまく数えないと、枠にぴったりはまらないのがプログラム。<br /> | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
リファレンスは以下のとおりです。<br /> | リファレンスは以下のとおりです。<br /> | ||
http://msdn.microsoft.com/ja-jp/library/78zh94ax.aspx<br /> | http://msdn.microsoft.com/ja-jp/library/78zh94ax.aspx<br /> | ||
http://msdn.microsoft.com/ja-jp/library/z50ty2zh.aspx<br /> | http://msdn.microsoft.com/ja-jp/library/z50ty2zh.aspx<br /> | ||
− | _tcslen(TCHA型設定時)/wcslen(Unicode設定)/strlen(マルチバイト設定) | + | _tcslen(TCHA型設定時)/wcslen(Unicode設定)/strlen(マルチバイト設定)マルチバイト設定時の日本語対応関数 _mbslenになります。第一引数がNULLのとき、アクセス違反が発生します。<br /> |
− | マルチバイト設定時の日本語対応関数 _mbslenになります。第一引数がNULLのとき、アクセス違反が発生します。<br /> | + | |
− | + | ||
lenの前にnが付くものは第二引数に最大文字数を設定する必要があり、文字列がそれを超えた場合は最大文字数を返します。<br /> | lenの前にnが付くものは第二引数に最大文字数を設定する必要があり、文字列がそれを超えた場合は最大文字数を返します。<br /> | ||
_tcsnlen(TCHA型設定時)/wcsnlen(Unicode設定)/strnlen(マルチバイト設定) サフィックスに_sが付く関数では、第一引数がNULLときは戻り値が0になります。<br /> | _tcsnlen(TCHA型設定時)/wcsnlen(Unicode設定)/strnlen(マルチバイト設定) サフィックスに_sが付く関数では、第一引数がNULLときは戻り値が0になります。<br /> | ||
マルチバイト設定時の日本語対応関数 _mbsnlen<br /> | マルチバイト設定時の日本語対応関数 _mbsnlen<br /> | ||
<br /> | <br /> | ||
− | _mbstrlenおよび_mbstrnlen は無効なマルチバイトを含む場合に戻り値- | + | _mbstrlenおよび_mbstrnlen は無効なマルチバイトを含む場合に戻り値-1を返します。_mbstrnlen は最大文字を超えると例外処理が発生し戻り値に-1とするとともにEINVAL に errnoを格納します。<br /> |
− | + | ||
更にサフィックスに_lが付くものは最後の引数として、ロケール設定ができます。ロケール設定の無い関数はsetlocale関数で設定された値に従います。<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 /> | 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 /> | 要するに?<br /> | ||
− | + | _tcslenを使うのが良いでしょう。Locale設定はあらかじめ実施しておくのが良いと思います。strnlen_sやwcsnlen_sはNULLの文字列の場合に0を返してくれるのはなんか良さげですが、文字列の終端が必ず\0で終わっていさえすれば必要のないことです。それはヌル文字でもいいわけです。アドレスがヌルのヌルポインターのときにプログラムが止まるよって言ってます。なんか、いっぱいありすぎて迷うけど…。 | |
− | + | ||
− | + | ||
− | + | _tcslen!<br /> | |
− | + | ||
− | + | ||
+ | _lが付く関数は個別にLocale変換が必要な場合にのみ使えば良いでしょう。_tcsnlenで最大文字数を設定するのは、一見安全そうですが、なんか無駄なような気がします。あきらかに最大文字数がわかるような場合には、なんか入れておいて_tcsnlen_sってのはいい選択肢だと思います。<br /> | ||
+ | |||
+ | |||
<syntaxhighlight lang="cpp" line start="1"> | <syntaxhighlight lang="cpp" line start="1"> | ||
#include <tchar.h> | #include <tchar.h> | ||
72行: | 74行: | ||
StrCount=22 | StrCount=22 | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | _mb系の関数を利用するには、 | + | _mb系の関数を利用するには、<nowiki>#include <mbstring.h></nowiki>をインクルードする必要があります。<br /> |
− | <nowiki>#include <mbstring.h></nowiki>をインクルードする必要があります。<br /> | + | |
− | + | 更に_mbslenは文字列長探索をしたい文字列変数の引数が、unsigned char型ですので、wchar_t型、char型の引数では文字列長を探索することは出来ません。あえて実施するならば、reinterpret_cast<unsigned char*>(※charポインタ型※)と強制的なキャストを実施することで、動作させることができます。_mbstrlenはchar型を引数にしますので、wchar_t型を使わない場合の日本語文字列長検索として使うことが出来ます。<br /> | |
− | 更に_mbslenは文字列長探索をしたい文字列変数の引数が、unsigned | + | |
− | + | ||
− | + | 但し、この強制キャストは定数文字列const宣言のある文字列に対しては操作が出来ないため、文字列のコピーを作成する必要があります。文字列コピー操作の詳細は次の項目に記載予定なので、順番に読み進めている人は、コピー操作について理解してから戻ってきた方が良いかもしれません。<br /> | |
− | + | ||
− | + | ||
− | + | ||
<syntaxhighlight lang="cpp" line start="1"> | <syntaxhighlight lang="cpp" line start="1"> | ||
#include <tchar.h> | #include <tchar.h> | ||
105行: | 106行: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | という具合にして、const | + | という具合にして、const char→char→_mabslenで文字列長探索が出来ます。出力結果は以下のとおりです。<br /> |
− | + | ||
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索 | const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索 | ||
151行: | 151行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | といった具合にいろいろな関数があるので、一つづつ掘り下げて理解しておくのも、必要です。こういう違いがあるということを把握していれば、臨機応変に対応しやすくなるかもです。自分は分かったつもりにならずに、常に謙虚に確かめてみる姿勢ってのは、必要なんじゃないかと思います。そして常に、自分が実施するであろうパターンを網羅して確かめる。だから、あえて文字列の配列の場合にどうやればいいのかを探ります。 | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
=='''文字列コピー'''== | =='''文字列コピー'''== |