C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列コピー) |
(→文字列コピー) |
||
199行: | 199行: | ||
size_t requiredSize = 0; | size_t requiredSize = 0; | ||
size_t sizecStr0=0; | size_t sizecStr0=0; | ||
− | |||
− | |||
− | |||
− | |||
TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | ||
210行: | 206行: | ||
unsigned char **ppucStr2; | unsigned char **ppucStr2; | ||
ppucStr2 = new unsigned char*[sizeof(cStr1)/sizeof(*cStr1)]; | ppucStr2 = new unsigned char*[sizeof(cStr1)/sizeof(*cStr1)]; | ||
+ | |||
+ | //_tcscpy_s(wcscpy_s)関数での文字列コピー | ||
for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | for(int i = 0; i < (sizeof(cStr0)/sizeof(*cStr0)); i++){ | ||
ppcStr0[i] = new TCHAR[_tcslen(cStr0[i]) + 1]; | ppcStr0[i] = new TCHAR[_tcslen(cStr0[i]) + 1]; | ||
215行: | 213行: | ||
} | } | ||
+ | //strcpy_s関数での文字列コピー | ||
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | ||
ppcStr1[i] = new char[strlen(cStr1[i]) + 1]; | ppcStr1[i] = new char[strlen(cStr1[i]) + 1]; | ||
strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//ココ! | strcpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr1[i]);//ココ! | ||
} | } | ||
+ | |||
+ | //_mbscpy_s関数での文字列コピー | ||
for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | for(int i = 0; i < (sizeof(cStr1)/sizeof(*cStr1)); i++){ | ||
sizecStr0 = strlen(ppcStr1[i]) + 1; | sizecStr0 = strlen(ppcStr1[i]) + 1; | ||
224行: | 225行: | ||
_mbscpy_s(ppucStr2[i], sizecStr0,reinterpret_cast<unsigned char*>(ppcStr1[i]));//ココ! | _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)); | ||
233行: | 236行: | ||
printf("_mbslen(cStr1[i])=%d\nppucStr2=%s,\n cStr1=%s,\n\n",_mbslen(ppucStr2[i]),ppucStr2[i],*(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++){ | ||
delete[] *(ppcStr0 + i); | delete[] *(ppcStr0 + i); | ||
253行: | 258行: | ||
マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、<br /> | マルチバイト型の2バイト文字認識操作関数って結局は、char型と同じなので、<br /> | ||
文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<br /> | 文字数を数えるときはstrlenで数えないといけない。char型と_mbsxxx関数を行ったり来たりするだけです。<br /> | ||
− | 出力結果は以下のとおり | + | 出力結果は以下のとおり<br /> |
<syntaxhighlight lang="cpp"> | <syntaxhighlight lang="cpp"> | ||
_tcslen(cStr0[i])=21 | _tcslen(cStr0[i])=21 | ||
299行: | 304行: | ||
cStr1=表示:よねウィキの機能2<yonewiki>, | cStr1=表示:よねウィキの機能2<yonewiki>, | ||
</syntaxhighlight> | </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とおりの数値を保有します。 | ||
=='''文字列連結'''== | =='''文字列連結'''== |