CString型の長い文字列を一定の長さの複数文字列に分割したいのですが方法がわかりません。
調べてみた所、_ismbsleadを使えば良さそうなのですが使い方も解りません。
//これを
CString ="全角ハンカクトがまざった文字列デス";
//こうしたい
CString A,B,C
A="全角ハンカクト"
B="がまざった"
C="文字列デス"
初心者ですので質問の仕方がおかしいかもしれませんが
よろしくお願い致します。
>一定の長さの
とは?文字数?Shift_JISコードでのバイト数?
>//こうしたい
の例だと、一定の長さではない気がするんですけど。
A:7文字,14Byte(半角カタカナだとすると9Byte)
B:5文字,10Byte
C:5文字,10Byte(半角カタカナだとすると8Byte)
Aの ハンカクト が 半角カタカナ とすると
(A:9Byte,B:10Byte,C:10Byte)
なき別れを考えて文字として解釈できるところで区切るという意味でしょうか?
Blue様、ご返事をありがとうございます。
質問がいいかげんでした、申し訳ありません。
文字コードはShift_JISです。
先ほど投稿したCString ="全角ハンカクトがまざった文字列デス";
のカタカナ部分は半角文字です。これを指定されたバイト数で分割
したいと言う意味です。
よろしく、おねがいいたします。
チョー適当。
もっと効率のよい方法あるっぽい。
#include <afx.h>
#include <iostream>
int main()
{
char buff[11];
CString str("全角ハンカクトがまざった文字列デスYO!"); // ハンカクトは半角カタカナ
CStringArray list;
for (int i = 0, index = 0; i < str.GetLength(); ++i)
{
buff[index++] = str.GetAt(i);
if (_ismbblead(str.GetAt(i)))
{
if (index == 10)
{
--i;
buff[9] = '\0';
}
else
{
++i;
buff[index++] = str.GetAt(i);
}
}
if (index == 10)
{
buff[index] = '\0';
list.Add(buff);
index = 0;
}
}
if (index != 0)
{
buff[index] = '\0';
list.Add(buff);
}
for (int j = 0; j < list.GetSize(); ++j)
std::cout << (LPCSTR)list.GetAt(j) << std::endl;
return 0;
}
こっちのほうがきれいかも。
int index = 0;
for (const char* p = str; *p; ++p)
{
buff[index++] = *p;
if (_ismbblead(*p))
{
if (index == 10)
{
--p;
buff[9] = '\0';
}
else
{
buff[index++] = *++p; // チョイ微妙
}
}
if (index == 10)
{
buff[index] = '\0';
list.Add(buff);
index = 0;
}
}
if (index != 0)
{
buff[index] = '\0';
list.Add(buff);
}
Blue様
ありがとうございます。解決いたしました。