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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
桜餅(拡散型)
記事: 3
登録日時: 10年前

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

#1

投稿記事 by 桜餅(拡散型) » 10年前

win用 shift-jis
例えば、char *tesに「今日はいい天気ですね」と入っていたとします。
これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?

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

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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 10年前

素直に1文字ずつ数えて指定文字数で分割するプログラムを書き、コンパイルし、実行すればいいと思います。
Shuft_JISの2バイト文字の範囲の情報は、ここに載っています。
漢字コードについて
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 10年前

桜餅(拡散型) さんが書きました:これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?
strtokのように渡された領域を再利用するのではなく、
a, b, cにそれぞれ結果用の領域を用意しないといけないことに注意が必要ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#4

投稿記事 by みけCAT » 10年前

オフトピック
ちなみに、C言語のchar*型には文字や文字列の「場所」は入りますが、文字や文字列そのものは入りません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

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

#5

投稿記事 by かずま » 10年前

"今日はいい天気ですね" は 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バイト文字が混在するマルチバイト
文字列なので、上のコードのように単純にはいきません。
もっと詳しい説明を希望しますか?

閉鎖

“C言語何でも質問掲示板” へ戻る