ページ 11

C マルチバイト文字の入った char*型を指定文字数で分割

Posted: 2015年7月01日(水) 10:24
by 桜餅(拡散型)
win用 shift-jis
例えば、char *tesに「今日はいい天気ですね」と入っていたとします。
これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?

*a 3文字 今日は
*b 4文字 いい天気
*c 3文字 ですね

よろしくお願い致します。

Re: C マルチバイト文字の入った char*型を指定文字数で分割

Posted: 2015年7月01日(水) 10:52
by みけCAT
素直に1文字ずつ数えて指定文字数で分割するプログラムを書き、コンパイルし、実行すればいいと思います。
Shuft_JISの2バイト文字の範囲の情報は、ここに載っています。
漢字コードについて

Re: C マルチバイト文字の入った char*型を指定文字数で分割

Posted: 2015年7月01日(水) 12:31
by みけCAT
桜餅(拡散型) さんが書きました:これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?
strtokのように渡された領域を再利用するのではなく、
a, b, cにそれぞれ結果用の領域を用意しないといけないことに注意が必要ですね。

Re: C マルチバイト文字の入った char*型を指定文字数で分割

Posted: 2015年7月01日(水) 12:35
by みけCAT
オフトピック
ちなみに、C言語のchar*型には文字や文字列の「場所」は入りますが、文字や文字列そのものは入りません。

Re: C マルチバイト文字の入った char*型を指定文字数で分割

Posted: 2015年7月01日(水) 22:16
by かずま
"今日はいい天気ですね" は 2バイト文字だけで構成されているので、
3文字、4文字、3文字で分割したければ、6バイト、8バイト、6バイトで
分割すればよいことになります。

コード:

#include <stdio.h>
 
int main(void)
{
    char *tes = "今日はいい天気ですね";
    char sa[7], sb[9], sc[7]; // 分割した文字列を入れる領域
    char *a, *b, *c;          // 分割した文字列を指すポインタ
    char *p = tes;            // p は分割開始位置へのポインタ
    p += sprintf(sa, "%.6s", p);
    p += sprintf(sb, "%.8s", p);
    p += sprintf(sc, "%.6s", p);
    a = sa;
    b = sb;
    c = sc;
    printf("a = [%s]\n", a);
    printf("b = [%s]\n", b);
    printf("c = [%s]\n", c);
    return 0;
}
ポインタに文字列は入りません。
文字列を入れる領域は、何らかの手段で別に確保しなければなりません。
ポインタはその文字列を指すだけです。
ここまでは理解できますか?
分からないところがあれば質問してください。

一般に Shift JIS の文字列は 2バイト文字と 1バイト文字が混在するマルチバイト
文字列なので、上のコードのように単純にはいきません。
もっと詳しい説明を希望しますか?