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

提供: yonewiki
移動: 案内, 検索
(文字列コピー)
(文字列コピー)
197行: 197行:
 
int main() {
 
int main() {
 
_tsetlocale( LC_ALL, _T("Japanese"));
 
_tsetlocale( LC_ALL, _T("Japanese"));
 +
size_t requiredSize = 0;
 +
size_t sizecStr0=0;
 +
 +
size_t *sizeReturnValue;
 +
sizeReturnValue = new size_t;
 +
*sizeReturnValue=0;
 +
 
TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")};
 
TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")};
 
const char *cStr1[]={" ","表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"};
 
const char *cStr1[]={" ","表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"};
 
TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)];
 
TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)];
unsigned char **ppcStr1 = new char*[sizeof(cStr1)/sizeof(*cStr1)];
+
char **ppcStr1 = new char*[sizeof(cStr1)/sizeof(*cStr1)];
 +
unsigned char **ppucStr2;
 +
ppucStr2 = new unsigned char*[sizeof(cStr1)/sizeof(*cStr1)];
 
for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){
 
for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){
                _tprintf(_T("cStr0=%s sizeof=%d StrCount=%d\n"), cStr0[i], sizeof(cStr0)/sizeof(*cStr0),_tcslen(cStr0[i]));
 
 
ppcStr0[i] = new TCHAR[_tcslen(cStr0[i]) + 1];
 
ppcStr0[i] = new TCHAR[_tcslen(cStr0[i]) + 1];
_tprintf(_T("cStr0=%s\n\n"),*(cStr0 + i));
 
 
_tcscpy_s(ppcStr0[i], _tcslen(cStr0[i]) + 1,cStr0[i]);//ココ!
 
_tcscpy_s(ppcStr0[i], _tcslen(cStr0[i]) + 1,cStr0[i]);//ココ!
 
}
 
}
 +
 
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){
 
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){
                printf("cStr1=%s sizeof=%d StrCount=%d\n", cStr1[i], sizeof(cStr1)/sizeof(*cStr1),strlen(cStr1[i]));
+
ppcStr1[i] = new char[strlen(cStr1[i]) + 1];
ppcStr1[i] = new unsigned char[strlen(cStr1[i]) + 1];
+
strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//ココ!
printf("cStr1=%s\n\n"),*(cStr1 + i));
+
}
_mbscpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr0[i]);//ココ!
+
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){
 +
        printf("cStr1=%s sizeof=%d StrCount=%d\n", cStr1[i], sizeof(cStr1)/sizeof(*cStr1),strlen(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++){
 
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));
+
_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++){
 
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));
+
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++){
 
for(int i = 0; i < sizeof(cStr0)/sizeof(*cStr0); i++){
225行: 240行:
 
delete[] *(ppcStr1 + i);
 
delete[] *(ppcStr1 + i);
 
}
 
}
 +
for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){
 +
delete[] *(ppucStr2 + i);
 +
}
 +
delete[] ppucStr2;
 
delete[] ppcStr0;
 
delete[] ppcStr0;
 
delete[] ppcStr1;
 
delete[] ppcStr1;
231行: 250行:
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
という感じでしたね。
+
という感じでしたね。無理やり_mbscpy関数を使ってみるとこんな感じですね。unsigned char型は宣言と同時にnew演算子の定義は出来ないようです。<br />
 +
const型のcharからはキャストできないから、結局は一度、strcpy_sを使って、char型の文字列に置き換えないといけないです。<br />
 +
マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、<br />
 +
文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<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>
  
 
=='''文字列連結'''==
 
=='''文字列連結'''==

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



個人用ツール
名前空間

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