文字列の分割

解決


テレスコ  2007-02-20 19:45:43  No: 64496

CString型の長い文字列を一定の長さの複数文字列に分割したいのですが方法がわかりません。
調べてみた所、_ismbsleadを使えば良さそうなのですが使い方も解りません。

//これを
CString ="全角ハンカクトがまざった文字列デス";

//こうしたい
CString A,B,C
A="全角ハンカクト"
B="がまざった"
C="文字列デス"

初心者ですので質問の仕方がおかしいかもしれませんが
よろしくお願い致します。


Blue  2007-02-20 20:01:55  No: 64497

>一定の長さの
とは?文字数?Shift_JISコードでのバイト数?

>//こうしたい
の例だと、一定の長さではない気がするんですけど。

A:7文字,14Byte(半角カタカナだとすると9Byte)
B:5文字,10Byte
C:5文字,10Byte(半角カタカナだとすると8Byte)

Aの ハンカクト が 半角カタカナ とすると
(A:9Byte,B:10Byte,C:10Byte)
なき別れを考えて文字として解釈できるところで区切るという意味でしょうか?


テレスコ  2007-02-20 20:30:31  No: 64498

Blue様、ご返事をありがとうございます。

質問がいいかげんでした、申し訳ありません。

文字コードはShift_JISです。
先ほど投稿したCString ="全角ハンカクトがまざった文字列デス";
のカタカナ部分は半角文字です。これを指定されたバイト数で分割
したいと言う意味です。

よろしく、おねがいいたします。


Blue  2007-02-20 20:42:31  No: 64499

チョー適当。
もっと効率のよい方法あるっぽい。

#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;
}


Blue  2007-02-20 20:47:36  No: 64500

こっちのほうがきれいかも。

    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);
    }


テレスコ  2007-02-20 22:03:10  No: 64501

Blue様
ありがとうございます。解決いたしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加