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

提供: yonewiki
移動: 案内, 検索
(文字列コピー)
(文字列コピー)
199行: 199行:
 
size_t requiredSize = 0;
 
size_t requiredSize = 0;
 
size_t sizecStr0=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>")};
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とおりの数値を保有します。
  
 
=='''文字列連結'''==
 
=='''文字列連結'''==

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



個人用ツール
名前空間

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