C 文字列操作のソースを表示
新しいページはコチラ
移動:
案内
,
検索
※このページではC言語にも存在していたという意味で記事タイトルがC 文字列操作になっていますが、<br /> [[C PlusPlus|C++]]でも同様です。[[C PlusPlus|C++]]だけの機能がある場合は明記します。<br /> <br /> == '''文字列操作''' == 文字列のコピー、連結、比較、一致、区切り文字分割、探索、文字列長取得といった操作を文字列操作と呼びます。<br /> 上記のような操作はCRT関数として提供されているため、関数の使い方さえ覚えれば簡単に操作できます。<br /> 更に、文字列の型変換、文字コード変換、大文字小文字変換、半角文字、全角文字変換、ファイルパス操作、ファイル名操作<br /> 拡張子取得といった文字列操作の応用もプログラミングでは必要になってきますし、文字列の検索と置換、<br /> ファイルへの入出力といった操作までを習得すると概ねの操作ができるようになります。<br /> <br /> 上記のように日本語でまとめて言い換えるのは簡単ですが、一つ一つを実際にやってみるとなると、そう簡単でもありません。<br /> メモリに保管される文字列を操作するというのは、手続きが複雑です。<br /> コピーひとつにしても、どういった文字列を基にして、何文字目から何文字目までをコピーするのか?<br /> それにはどれくらいの大きさの文字列長があるのか?どういった変数に格納するのか?領域はちゃんと確保されているのか?<br /> 手続きがうまくいかなかった場合はどうするのか?と何気に細かいことを教えてあげないと動かないのがコンピュータです。<br /> コンピュータ側からすると、人間のようには解釈は出来ない、そのかわりわからないことがあれば、<br /> どんな地道なことをしててでも調べてやるから、コンピュータに指令するのに必要な情報をそろえてほしい。<br /> まとめては動作させれないけど、内部的にはひとつづつ着実にコピーして、最終的には全部をコピーしてくれる。<br /> なんだか新入社員のようにいちいち指示しないといけないけど、まぁ的確に指示をすればやる気だけはあって、こなしてくれる。<br /> 新入社員はほっといても成長しますが、コンピュータはほっとくと延々と成長しません。勝手にやってくれるようになるには、<br /> 勝手にやれるようになるための成長するプログラムが必要になります。偉い人たちは地道にやっているようです。<br /> <br /> 成長云々の件はここでは関係ありませんので、置いておくとして、文字列の操作をひとつづつやってみましょう。(書きかけの記事です。最終更新131128)<br /> 文字列操作に関する関数は以下のアドレスのとおりです。<br /> http://msdn.microsoft.com/ja-jp/library/f0151s4x.aspx<br /> 上記があれば、自分が説明する必要はもうないかなと思うわけですが、一応、自分なりに。<br /> =='''文字列長取得'''== 文字列の長さを知りたいと思うことは、日常ではほとんどないですが、プログラムでは必要になるパターンが多いです。<br /> 例えば、どれくらいのメモリサイズを確保すれば、いいのか?とか、文字列から抜き出した文字数が長い場合にはスクロールバーをつけたりとか、<br /> 文字列の長さによって処理を分岐させたりすることもあります。この他、C言語においては、ほとんどの文字列操作関数で、その操作する文字列変数の<br /> 文字列の長さを引数として与えなければならなかったりと、文字列操作の中でも基本中の基本となる部分です。<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>")}; 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> _mb系の関数を利用するには、<br /> <nowiki>#include <mbstring.h></nowiki>をインクルードする必要があります。<br /> <br /> 更に_mbslenは文字列長探索をしたい文字列変数の引数が、unsigned char型ですので、<br /> wchar_t型、char型の引数では文字列長を探索することは出来ません。あえて実施するならば、<br /> reinterpret_cast<unsigned char*>(※charポインタ型※)と強制的なキャストを実施することで、動作させることができます。<br /> _mbstrlenはchar型を引数にしますので、wchar_t型を使わない場合の日本語文字列長検索として使うことが出来ます。<br /> 但し、この強制キャストは定数文字列const宣言のある文字列に対しては操作が出来ないため、文字列のコピーを作成する必要があります。<br /> 文字列コピー操作の詳細は次の項目に記載予定なので、順番に読み進めている人は、コピー操作について理解してから戻ってきた方が良いかもしれません。<br /> <syntaxhighlight lang="cpp" line start="1"> #include <tchar.h> #include <mbstring.h> int main() { _tsetlocale(LC_ALL, _T("Japanese")); const char *cStr1[]={"", "表示:よねウィキの機能<yonewiki>", "表示:よねウィキの機能1<yonewiki>", "表示:よねウィキの機能2<yonewiki>"}; char **ppcStr1 = new char* [sizeof(cStr1)/sizeof(*cStr1)]; _tprintf(_T("const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索\n")); for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ ppcStr1[i] = new char[strlen(cStr1[i]) + 1];//まずは単純に文字列をコピーするための領域を確保。 strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//コピー } for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ //強制キャストでunsigned char*型に変換して文字列長を探索。 printf("%2d/%2d:cStr1[%2d]=%s\nStrCount=%d\n\n",i, sizeof(cStr1)/sizeof(*cStr1),i, ppcStr1[i],_mbslen(reinterpret_cast<unsigned char*>(ppcStr1[i]))); } for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ delete[] *(ppcStr1 + i); } delete[] ppcStr1; } </syntaxhighlight> という具合にして、const char→char→_mabslenで文字列長探索が出来ます。<br /> 出力結果は以下のとおりです。<br /> <syntaxhighlight lang="cpp"> const マルチバイト文字→マルチバイト文字コピー→_mbslen関数2バイト文字認識文字列長探索 0/ 4:cStr1[ 0]= StrCount=0 1/ 4:cStr1[ 1]=表示:よねウィキの機能<yonewiki> StrCount=21 2/ 4:cStr1[ 2]=表示:よねウィキの機能1<yonewiki> StrCount=22 3/ 4:cStr1[ 3]=表示:よねウィキの機能2<yonewiki> StrCount=22 </syntaxhighlight> _mbstrlen関数を使う場合はコピー操作が必要にならず、const宣言している文字列変数を使っての文字列長探索ができます。<br /> <syntaxhighlight lang="cpp" line start="1"> #include <tchar.h> #include <mbstring.h> int main() { _tsetlocale(LC_ALL, _T("Japanese")); const char *cStr1[]={"", "表示:よねウィキの機能<yonewiki>", "表示:よねウィキの機能1<yonewiki>", "表示:よねウィキの機能2<yonewiki>"}; _tprintf(_T("const マルチバイト文字→_mbstrlen関数2バイト文字認識文字列長探索\n")); for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ printf("%2d/%2d:cStr1[%2d]=%s\nStrCount=%d\n\n",i, sizeof(cStr1)/sizeof(*cStr1),i, cStr1[i],_mbstrlen(cStr1[i])); } } </syntaxhighlight> 出力結果は以下のとおりです。<br /> <syntaxhighlight lang="cpp"> const マルチバイト文字→_mbstrlen関数2バイト文字認識文字列長探索 0/ 4:cStr1[ 0]= StrCount=0 1/ 4:cStr1[ 1]=表示:よねウィキの機能<yonewiki> StrCount=21 2/ 4:cStr1[ 2]=表示:よねウィキの機能1<yonewiki> StrCount=22 3/ 4:cStr1[ 3]=表示:よねウィキの機能2<yonewiki> StrCount=22 </syntaxhighlight> といった具合にいろいろな関数があるので、一つづつ掘り下げて理解しておくのも、必要です。<br /> こういう違いがあるということを把握していれば、臨機応変に対応しやすくなるかもです。<br /> 自分は分かったつもりにならずに、常に謙虚に確かめてみる姿勢ってのは、必要なんじゃないかと思います。<br /> そして常に、自分が実施するであろうパターンを網羅して確かめる。だから、あえて文字列の配列の場合に<br /> どうやればいいのかを探ります。 =='''文字列コピー'''== 文字列のコピー?なんでコピーするの?ってなりそうですけど、変数の代入みたいなものです。<br /> 元の文字列はとっておいて、コピーした方を加工するということです。あるいはその逆。紙のコピーだと原版が綺麗だけど、原版もコピーも同じだから…<br /> a=13;<br /> b=a;<br /> b=b*b;<br /> b=a;<br /> b=b*b*b;<br /> ってな感じのことやったりしません?aの値は取っておきたい。そういうときに使ったりするのかなぁと思います。<br /> リファレンスは以下のとおりです。<br /> http://msdn.microsoft.com/ja-jp/library/kk6xf663.aspx<br /> http://msdn.microsoft.com/ja-jp/library/td1esda9.aspx<br /> http://msdn.microsoft.com/ja-jp/library/xdsywd25.aspx<br /> http://msdn.microsoft.com/ja-jp/library/5dae5d43.aspx<br /> また、例によってマルチバイト文字版strcpy、ワイド文字版wcscpy、マルチバイト2バイト文字認識版_mbscpy、セキュリティ強化版の_sサフィックスがあります。<br /> _s無し版の引数は<br /> コピー先文字列変数先頭char型アドレス、コピー元文字列変数先頭char型アドレス(文字列の終端に\0があること)<br /> となっています。_mbscpyの引数は第一引数、第二引数共にunsigned charになっています。この微妙に使いにくい引数の異なり…。しょうがないのかなぁ。<br /> <br /> そして、_s版は第2引数にコピー先文字列変数先頭char型アドレスの大きさを必要とします。_sが付かない関数で第二引数だったコピー元は第三引数にずれます。<br /> strncpyのようにcpyの前にnが付くパターンでマルチバイト文字版、ワイド文字版、マルチ2バイト文字対応版と更には_lサフィックスでロケール個別設定ができる関数があります。<br /> マルチバイト2バイト文字対応版にはバイト長を引数とするcpyの前にbが付いたものもあります。<br /> でも…マルチバイト2バイト文字対応文字ってもともと配列の要素一つに1バイトを格納しているから、バイト長で扱っても、要素数で扱っても変わらないから<br /> 何が違うのか?よくわからない。_mbs系のcpy関数の利点ってなんだろう。このへんはまた今度、考えてみよう。 全部で、<br /> strcpy、wcscpy、_mbscpy , strcpy_s、wcscpy_s、_mbscpy_s ,<br /> strncpy、_strncpy_l、wcsncpy、_wcsncpy_l、_mbsncpy、_mbsncpy_l , strncpy_s、_strncpy_s_l、wcsncpy_s、_wcsncpy_s_l、_mbsncpy_s、_mbsncpy_s_l<br /> _mbsnbcpy、_mbsnbcpy_l , _mbsnbcpy_s、_mbsnbcpy_s_l <br /> これだけあります。<br /> <br /> で、結局は_tcsncpy_sを使いなさいってことになります。Unicode設定ならワイド文字版で、文字列長に厳しい設定が必要なwcsncpy_sだね。 第二引数は配列の大きさ+終端\0のための要素1つ分。バイト数ではないです。<br /> 動的に生成した変数の場合は配列の大きさが取得できないので、wcslen(_tcslen)のような文字列長取得関数を使って、戻ってきた値に\0の要素のために1を加算した値が良いです。<br /> <syntaxhighlight lang="cpp" line start="1"> #include <iostream> //#include<locale.h> tchar.hがインクルードされていれば、いらない。 #include<tchar.h> int main() { _tsetlocale( LC_ALL, _T("Japanese")); size_t requiredSize = 0; size_t sizecStr0=0; TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; const char *cStr1[]={" ","表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"}; TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)]; char **ppcStr1 = new char*[sizeof(cStr1)/sizeof(*cStr1)]; unsigned char **ppucStr2; ppucStr2 = new unsigned char*[sizeof(cStr1)/sizeof(*cStr1)]; //_tcscpy_s(wcscpy_s)関数での文字列コピー for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ ppcStr0[i] = new TCHAR[_tcslen(cStr0[i]) + 1]; _tcscpy_s(ppcStr0[i], _tcslen(cStr0[i]) + 1,cStr0[i]);//ココ! } //strcpy_s関数での文字列コピー for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ ppcStr1[i] = new char[strlen(cStr1[i]) + 1]; strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//ココ! } //_mbscpy_s関数での文字列コピー for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ sizecStr0 = strlen(ppcStr1[i]) + 1; ppucStr2[i] = new unsigned char[sizecStr0]; _mbscpy_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]));//ココ! } //出力部分 for(int i = 0; i < sizeof(cStr0)/sizeof(*cStr0); i++){ _tprintf(_T("_tcslen(cStr0[i])=%d\nppcStr0=%s,\n cStr0=%s,\n\n"),_tcslen(cStr0[i]),*(ppcStr0 + i),*(cStr0 + i)); } for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){ printf("strlen(cStr1[i])=%d\nppcStr1=%s,\n cStr1=%s,\n\n",strlen(cStr1[i]),*(ppcStr1 + i),*(cStr1 + i)); } for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){ printf("_mbslen(cStr1[i])=%d\nppucStr2=%s,\n cStr1=%s,\n\n",_mbslen(ppucStr2[i]),ppucStr2[i],*(cStr1 + i)); } //動的に確保したメモリの解放処理 for(int i = 0; i < sizeof(cStr0)/sizeof(*cStr0); i++){ delete[] *(ppcStr0 + i); } for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){ delete[] *(ppcStr1 + i); } for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){ delete[] *(ppucStr2 + i); } delete[] ppucStr2; delete[] ppcStr0; delete[] ppcStr1; printf("\n"); return 0; } </syntaxhighlight> という感じでしたね。無理やり_mbscpy関数を使ってみるとこんな感じですね。unsigned char型は宣言と同時にnew演算子の定義は出来ないようです。<br /> const型のcharからはキャストできないから、結局は一度、strcpy_sを使って、char型の文字列に置き換えないといけないです。<br /> マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、<br /> 文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<br /> 出力結果は以下のとおり<br /> <syntaxhighlight lang="cpp"> _tcslen(cStr0[i])=21 ppcStr0=表示:よねウィキの機能<yonewiki>, cStr0=表示:よねウィキの機能<yonewiki>, _tcslen(cStr0[i])=22 ppcStr0=表示:よねウィキの機能1<yonewiki>, cStr0=表示:よねウィキの機能1<yonewiki>, _tcslen(cStr0[i])=22 ppcStr0=表示:よねウィキの機能2<yonewiki>, cStr0=表示:よねウィキの機能2<yonewiki>, strlen(cStr1[i])=1 ppcStr1= , cStr1= , strlen(cStr1[i])=32 ppcStr1=表示:よねウィキの機能<yonewiki>, cStr1=表示:よねウィキの機能<yonewiki>, strlen(cStr1[i])=33 ppcStr1=表示:よねウィキの機能1<yonewiki>, cStr1=表示:よねウィキの機能1<yonewiki>, strlen(cStr1[i])=33 ppcStr1=表示:よねウィキの機能2<yonewiki>, cStr1=表示:よねウィキの機能2<yonewiki>, _mbslen(cStr1[i])=1 ppucStr2= , cStr1= , _mbslen(cStr1[i])=21 ppucStr2=表示:よねウィキの機能<yonewiki>, cStr1=表示:よねウィキの機能<yonewiki>, _mbslen(cStr1[i])=22 ppucStr2=表示:よねウィキの機能1<yonewiki>, cStr1=表示:よねウィキの機能1<yonewiki>, _mbslen(cStr1[i])=22 ppucStr2=表示:よねウィキの機能2<yonewiki>, cStr1=表示:よねウィキの機能2<yonewiki>, </syntaxhighlight> 上記に加えて、コピーする文字数を引数とするcpyの前にnが付く関数_tcsncpy_s/wcsncpy_s/strncpy_s/_mbsncpy_sにする場合は<br /> <syntaxhighlight lang="cpp"> … … //_tcscpy_s(ppcStr0[i], _tcslen(cStr0[i]) + 1,cStr0[i]);//ココ! _tcsncpy_s(ppcStr0[i], _tcslen(cStr0[i]) + 1,cStr0[i], _tcslen(cStr0[i]) + 1);//ココ! … … //strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//ココ! strncpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i],strlen(cStr1[i]) + 1);//ココ! … … //_mbscpy_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]));//ココ! _mbsncpy_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]), sizecStr0);//ココ! … … </syntaxhighlight> と、4つの引数をとるように記述します。第4引数が出力する最大文字の配列数です。_tcsncpy_sでは出力する文字数と考えることもできます。<br /> マルチバイト文字の場合は2バイト文字が切れずにコピーされるかどうかの保証ができません。切ろうとしている文字の数値が128以上ならば、<br /> 出力文字数に1を加えたり、減らすことで、そのような問題を解決することができます。unsigned charですので、負の数を持たないということになり、<br /> 数値比較する場合は0~255で比較ができます。char型なら負の数値としての扱いがあるため、-128~127の256とおりの数値を保有します。 =='''文字列連結'''== =='''文字列比較'''== =='''文字列一致'''== =='''文字列区切り文字分割'''== =='''文字列の型変換'''== =='''文字列文字コード変換'''== =='''文字列大文字小文字変換'''== =='''文字列半角文字全角文字変換'''== =='''文字列ファイルパス操作'''== =='''文字列ファイル名操作'''== =='''文字列の検索と置換'''== =='''文字列ファイルへの入出力'''== *比較 *一致 *区切り文字分割 *探索 *正規表現 regex_match *文字列の型変換 *文字コード変換 *大文字小文字変換 *半角文字全角文字変換 *ファイルパス操作 *ファイル名操作 *拡張子取得 *文字列の検索と置換 *ファイルへの入出力 <!-- {|class="wikitable" !上位ビッツ\下位ビッツ!!0!!1!!2!!3!!4!!5!!6!!7!!8!!9!!A!!B!!C!!D!!E!!F |- |0||NUL||SOH||STX||ETX||EOT||ENQ||ACK||BEL|||BS||HT||LF||VT||FF||CR||SO||SI |- |1||DLE||DC1||DC2||DC3||DC4||NAK||SYN||ETB||CAN||EM||SUB||ESC||IS4||IS3||IS2||IS1 |- |2||SP||!||"||#||$||%||&||'||(||)||*||+||,||-||.||/ |- |3||0||1||2||3||4||5||6||7||8||9||:||;||<||=||>||? |- |4||@||A||B||C||D||E||F||G||H||I||J||K||L||M||N||O |- |5||P||Q||R||S||T||U||V||W||X||Y||Z||[||\||]||^||_ |- |6||`||a||b||c||d||e||f||g||h||i||j||k||l||m||n||o |- |7||p||q||r||s||t||u||v||w||x||y||z||{|| | ||} ||~||DEL |- |} {|class="wikitable" !上位ビッツ\下位ビッツ!!0!!1!!2!!3!!4!!5!!6!!7!!8!!9!!A!!B!!C!!D!!E!!F |- |8||||||BPH||NBH||||NEL||SSA||ESA||HTS||HTJ||VTS||PLD||PLU||RI||SS2||SS3 |- |9||DCS||PU1||PU2||STS||CCH||MW||SPA||EPA||SOS||||SCI||CSI||ST||OSC||PM||APC |- |A||||。||「||」||、||・||ヲ||ァ||ィ||ゥ||ェ||ォ||ャ||ュ||ョ||ッ |- |B||ー||ア||イ||ウ||エ||オ||カ||キ||ク||ケ||コ||サ||シ||ス||セ||ソ |- |C||タ||チ||ツ||テ||ト||ナ||ニ||ヌ||ネ||ノ||ハ||ヒ||フ||ヘ||ホ||マ |- |D||ミ||ム||メ||モ||ヤ||ユ||ヨ||ラ||リ||ル||レ||ロ||ワ||ン||゙||゚ |- |E|||||||||||||||||||||||||||||||| |- |F|||||||||||||||||||||||||||||||| |- -->
C 文字列操作
に戻る。
個人用ツール
ログイン
名前空間
ページ
議論
変種
表示
閲覧
ソースを表示
履歴表示
操作
検索
案内
メインページ
コミュニティ・ポータル
最近の出来事
最近の更新
おまかせ表示
ヘルプ
ツールボックス
リンク元
関連ページの更新状況
特別ページ