C 文字列操作 新しいページはコチラ
提供: yonewiki
(→文字列長取得) |
(→文字列コピー) |
||
189行: | 189行: | ||
<br /> | <br /> | ||
で、結局は_tcsncpy_sを使いなさいってことになります。Unicode設定ならワイド文字版で、文字列長に厳しい設定が必要なwcsncpy_sだね。 | で、結局は_tcsncpy_sを使いなさいってことになります。Unicode設定ならワイド文字版で、文字列長に厳しい設定が必要なwcsncpy_sだね。 | ||
+ | 第二引数は配列の大きさ+終端\0のための要素1つ分。バイト数ではないです。<br /> | ||
+ | 動的に生成した変数の場合は配列の大きさが取得できないので、wcslen(_tcslen)のような文字列長取得関数を使って、戻ってきた値に\0の要素のために1を加算した値が良いです。<br /> | ||
<syntaxhighlight lang="cpp" line start="1"> | <syntaxhighlight lang="cpp" line start="1"> | ||
#include <iostream> | #include <iostream> | ||
196行: | 198行: | ||
_tsetlocale( LC_ALL, _T("Japanese")); | _tsetlocale( LC_ALL, _T("Japanese")); | ||
TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | TCHAR *cStr0[]={_T("表示:よねウィキの機能<yonewiki>"),_T("表示:よねウィキの機能1<yonewiki>"),_T("表示:よねウィキの機能2<yonewiki>")}; | ||
− | TCHAR ** | + | const char *cStr1[]={" ","表示:よねウィキの機能<yonewiki>","表示:よねウィキの機能1<yonewiki>","表示:よねウィキの機能2<yonewiki>"}; |
+ | TCHAR **ppcStr0 = new TCHAR*[sizeof(cStr0)/sizeof(*cStr0)]; | ||
+ | unsigned char **ppcStr1 = new 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])); | _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]; | |
_tprintf(_T("cStr0=%s\n\n"),*(cStr0 + i)); | _tprintf(_T("cStr0=%s\n\n"),*(cStr0 + i)); | ||
− | _tcscpy_s( | + | _tcscpy_s(ppcStr0[i], _tcslen(cStr0[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])); | ||
+ | ppcStr1[i] = new unsigned char[strlen(cStr1[i]) + 1]; | ||
+ | printf("cStr1=%s\n\n"),*(cStr1 + i)); | ||
+ | _mbscpy_s(ppcStr1[i], strlen(cStr1[i]) + 1,cStr0[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\ | + | _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(cStr0)/sizeof(*cStr0); i++){ | for(int i = 0; i < sizeof(cStr0)/sizeof(*cStr0); i++){ | ||
− | delete[] *( | + | delete[] *(ppcStr0 + i); |
+ | } | ||
+ | for(int i = 0; i < sizeof(cStr1)/sizeof(*cStr1); i++){ | ||
+ | delete[] *(ppcStr1 + i); | ||
} | } | ||
− | delete[] | + | delete[] ppcStr0; |
+ | delete[] ppcStr1; | ||
printf("\n"); | printf("\n"); | ||
return 0; | return 0; |