win用 shift-jis
例えば、char *tesに「今日はいい天気ですね」と入っていたとします。
これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?
例
*a 3文字 今日は
*b 4文字 いい天気
*c 3文字 ですね
よろしくお願い致します。
C マルチバイト文字の入った char*型を指定文字数で分割
Re: C マルチバイト文字の入った char*型を指定文字数で分割
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C マルチバイト文字の入った char*型を指定文字数で分割
strtokのように渡された領域を再利用するのではなく、桜餅(拡散型) さんが書きました:これを3つの*a,*b,*cに指定文字数で分割したいのですがどうすればよろしいでしょうか?
a, b, cにそれぞれ結果用の領域を用意しないといけないことに注意が必要ですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C マルチバイト文字の入った char*型を指定文字数で分割
オフトピック
ちなみに、C言語のchar*型には文字や文字列の「場所」は入りますが、文字や文字列そのものは入りません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: C マルチバイト文字の入った char*型を指定文字数で分割
"今日はいい天気ですね" は 2バイト文字だけで構成されているので、
3文字、4文字、3文字で分割したければ、6バイト、8バイト、6バイトで
分割すればよいことになります。
ポインタに文字列は入りません。
文字列を入れる領域は、何らかの手段で別に確保しなければなりません。
ポインタはその文字列を指すだけです。
ここまでは理解できますか?
分からないところがあれば質問してください。
一般に Shift JIS の文字列は 2バイト文字と 1バイト文字が混在するマルチバイト
文字列なので、上のコードのように単純にはいきません。
もっと詳しい説明を希望しますか?
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バイト文字が混在するマルチバイト
文字列なので、上のコードのように単純にはいきません。
もっと詳しい説明を希望しますか?