C 文字列操作 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(文字列連結)
(文字列連結)
355行: 355行:
 
strcat、wcscat、_mbscat , strcat_s、wcscat_s、_mbscat_s <br />
 
strcat、wcscat、_mbscat , strcat_s、wcscat_s、_mbscat_s <br />
 
_mbsnbcat、_mbsnbcat_l , _mbsnbcat_s、_mbsnbcat_s_l<br />
 
_mbsnbcat、_mbsnbcat_l , _mbsnbcat_s、_mbsnbcat_s_l<br />
 +
<br />
 +
例によって_sのついた連結先文字列の配列サイズを明記する関数に_lのついた個別ロケール設定関数。<br />
 +
そして連結させたい文字列の文字数を記述するncatに文字数をバイト数で指定するnbcat。<br />
 +
あとはワイド文字のwcsで始まる関数。マルチバイトのstrで始まる関数。マルチバイト2バイト文字対応の_mbsで始まる関数。<br />
 +
全部で22種類。<br />
 +
先の文字列コピーのプログラムのコピーcpy系関数の後ろに連結cat系関数を追加して、文字列を2回繰り返されるようにしたサンプルです。<br />
 +
所謂(いわゆる)、手抜きです。ただし、連結関数では連結後の文字列の配列大きさを要求されるため、あらかじめ動的に確保する領域が2倍になっていることに<br />
 +
注意して下さい。<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;
  
例によって_sのついた連結先文字列の配列サイズを明記する関数に_lのついた個別ロケール設定関数。
+
TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")};
そして連結させたい文字列の文字数を記述するncatに文字数をバイト数で指定するnbcat。
+
const char *cStr1[]={" ","表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"};
あとはワイド文字のwcsで始まる関数。マルチバイトのstrで始まる関数。マルチバイト2バイト文字対応の_mbsで始まる関数。
+
TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)];
全部で22種類。
+
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]) * 2) + 1];
 +
_tcsncpy_s(ppcStr0[i], _tcslen(cStr0[i])  + 1,cStr0[i], _tcslen(cStr0[i]) + 1);//ココ!
 +
_tcsncat_s(ppcStr0[i], (_tcslen(cStr0[i]) * 2) + 1,cStr0[i], _tcslen(cStr0[i]) + 1);//ココ!
 +
}
 +
 
 +
//strcpy_s関数での文字列コピー
 +
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){
 +
ppcStr1[i] = new char[(strlen(cStr1[i]) * 2) + 1];
 +
strncpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i],strlen(cStr1[i]) + 1);//ココ!
 +
strncat_s(ppcStr1[i], (strlen(cStr1[i]) * 2) + 1,cStr1[i],strlen(cStr1[i]) + 1);//ココ!
 +
}
 +
 
 +
//_mbscpy_s関数での文字列コピー strcat関数部分ですでに2回繰り返しになった文字をさらに繰り返し連結する処理になってます。4回繰り返し文字列になります。
 +
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){
 +
sizecStr0 = (strlen(ppcStr1[i]) * 2) + 1;
 +
ppucStr2[i] = new unsigned char[sizecStr0];
 +
_mbsncpy_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]), _mbslen(reinterpret_cast<unsigned char*>(ppcStr1[i])));//ココ!
 +
_mbsncat_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]), _mbslen(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>
 +
 
 +
出力結果<br />
 +
<syntaxhighlight lang="cpp">
 +
_tcslen(cStr0[i])=21
 +
ppcStr0=表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>,
 +
cStr0=表示:よねウィキの機能<yonewiki>,
 +
 
 +
_tcslen(cStr0[i])=22
 +
ppcStr0=表示:よねウィキの機能1<yonewiki>表示:よねウィキの機能1<yonewiki>,
 +
cStr0=表示:よねウィキの機能1<yonewiki>,
 +
 
 +
_tcslen(cStr0[i])=22
 +
ppcStr0=表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>,
 +
cStr0=表示:よねウィキの機能2<yonewiki>,
 +
 
 +
strlen(cStr1[i])=1
 +
ppcStr1=  ,
 +
cStr1= ,
 +
 
 +
strlen(cStr1[i])=32
 +
ppcStr1=表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>,
 +
cStr1=表示:よねウィキの機能<yonewiki>,
 +
 
 +
strlen(cStr1[i])=33
 +
ppcStr1=表示:よねウィキの機能1<yonewiki>表示:よねウィキの機能1<yonewiki>,
 +
cStr1=表示:よねウィキの機能1<yonewiki>,
 +
 
 +
strlen(cStr1[i])=33
 +
ppcStr1=表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>,
 +
cStr1=表示:よねウィキの機能2<yonewiki>,
 +
 
 +
_mbslen(cStr1[i])=4
 +
ppucStr2=    ,
 +
cStr1= ,
 +
 
 +
_mbslen(cStr1[i])=84
 +
ppucStr2=表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>表示:よねウィキの機能<yonewiki>,
 +
cStr1=表示:よねウィキの機能<yonewiki>,
 +
 
 +
_mbslen(cStr1[i])=88
 +
ppucStr2=表示:よねウィキの機能1<yonewiki>表示:よねウィキの機能1<yonewiki>表示:よねウィキの機能1<yonewiki>表示:よねウィキの機能1<yonewiki>,
 +
cStr1=表示:よねウィキの機能1<yonewiki>,
 +
 
 +
_mbslen(cStr1[i])=88
 +
ppucStr2=表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>表示:よねウィキの機能2<yonewiki>,
 +
cStr1=表示:よねウィキの機能2<yonewiki>,
 +
</syntaxhighlight>
  
 
=='''文字列比較'''==
 
=='''文字列比較'''==

2013年12月1日 (日) 00:00時点における版



個人用ツール
名前空間

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