C言語関係掲示板

過去ログ

No.996 1バイト文字と2バイト文字を取り出すには

[戻る] [ホームページ]
No.764

1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/01 21:15:54)


どこまで出来ているか示してくださいという回答が良くありますが、
残念ながら全く分かりません。

本当に申し訳ありませんが、どうぞお願いいたします。

char a[]="あいaう";のように半角aが混ざった文字列から、
半角と全角に関係無く1文字づつ取り出すにはどうすれば良いのでしょうか?

このような質問は良く見かけるのですが、結局どうすれば良いのか解決に至ったものを見たことがありません。

どうかよろしくお願い致します。

No.765

Re:1バイト文字と2バイト文字を取り出すには
投稿者---YuO(2003/12/01 21:37:19)


>char a[]="あいaう";のように半角aが混ざった文字列から、
>半角と全角に関係無く1文字づつ取り出すにはどうすれば良いのでしょうか?

多バイト文字の長さはmblenで得られるので,
前から順に調べていけば取り出せます。


No.766

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/01 21:49:39)


回答ありがとうございます。

>多バイト文字の長さはmblenで得られるので,
>前から順に調べていけば取り出せます。

本当に申し訳ないのですが、mblenを使ってどうすれば、目的が果たせるのでしょうか?
いろいろなQ&Aサイトを見ても、この時点でありがとうございましたで終わっていて、結局どうすれば良いのか分かりません。

どうかご教授ください。


No.767

Re:1バイト文字と2バイト文字を取り出すには
投稿者---たいちう(2003/12/01 22:03:26)


> どこまで出来ているか示してくださいという回答が良くありますが、
> 残念ながら全く分かりません。

「全く分かりません」という表現も良くありますが、どのレベルでしょうか。
C言語を見るのも初めてな人から、半角・全角の区別についてだけは
「全く分かりません」という人の間で、あなたはどのレベルの人なのでしょうか。
まさか文字列の表示もできないとかじゃないですよね?
状況説明の努力を放棄しないでください。

あなたの課題のための前段階として、半角だけの文字列を切り分けるプログラムは
作れるでしょうか?文字列が全角だけからなる場合の切り分けは?

> 本当に申し訳ないのですが、mblenを使ってどうすれば、目的が果たせるのでしょうか?
> いろいろなQ&Aサイトを見ても、この時点でありがとうございましたで終わっていて、
> 結局どうすれば良いのか分かりません。

前段階までできている人は、mblenをヘルプで調べたら解決するからでしょう。

No.770

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/01 22:39:31)


回答ありがとうございます。

残念ながらヘルプを見ても分かりません。

例を参考にする学習方法もあると思うのですが、駄目でしょうか?

実力はVC++にて付箋紙ソフトを作ったことがあるくらいです。
残念ながら今回の質問については、まったく分かりません。

No.769

Re:1バイト文字と2バイト文字を取り出すには
投稿者---かずま(2003/12/01 22:29:20)


> mblenを使ってどうすれば、目的が果たせるのでしょうか?

環境に依存します。mblen が期待通りの値を返さない場合もあります。
次のプログラムは、Windows 上で、Borland C++ または Visual C++ で
コンパイルした場合、動くはずです。
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
    char a[] = "あいaう", *p;  int len;

    setlocale(LC_CTYPE, "");
    for (p = a; *p; p += len) {
        len = mblen(p, MB_CUR_MAX);
        if (len <= 0) break;
        printf("%d: %.*s\n", len, len, p);
    }
    return 0;
}


No.771

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/01 22:44:52)


かずまさん 回答本当にありがとうございます。

分かる人から見ればヘルプで分かるのかも知れませんが、
残念ながら私には分かりませんでした。

今後は、かずまさんの回答をベースに色々と発展形を考えてみます。
例があれば本当に分かりやすくて理解が早くて助かります。



No.778

Re:1バイト文字と2バイト文字を取り出すには
投稿者---RAPT(2003/12/02 00:43:42)


>例があれば本当に分かりやすくて理解が早くて助かります。
ヘルプに書いてあることが多い。


No.781

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/02 06:25:35)


教えていただいたコードですが、こんなにシンプルなもので実現できるとは驚きです。
シンプルゆえに奥が深く、一晩考えたのですが分からないことだらけです。

>printf("%d: %.*s\n", len, len, p);
このコードを単純化した
printf("%.*s\n", len, p);
こうした形は始めてみました。

%.*sはどう解釈したら良いのでしょうか?
また、対応するlenとpも普通はsに対して1個だと思うのですが、
色々調べましたが分かりません。

どうか教えていただきたいのですが。





No.783

Re:1バイト文字と2バイト文字を取り出すには
投稿者---たいちう(2003/12/02 09:26:59)


MSDNには書いてあるし、他のヘルプでもちゃんとしたものなら説明があるはずなのですが。

ここ

> 残念ながらヘルプを見ても分かりません。
>
> 例を参考にする学習方法もあると思うのですが、駄目でしょうか?

だめではないと思うけど、何から何まで教えて教えてというのは、
掲示板の利用の仕方としては不適切、というのが私の意見です。

ですがかずまさんのように、ソースをわざわざ作ってくれる人も多いので、
この掲示板ではそのような質問も構わないのかもしれません。
ただ、次回は"初心者"とか"学生"とかいうハンドルネームはやめてね、
くらいは言ってもいいでしょうか。

No.787

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/02 21:30:03)


回答ありがとうございます。

>MSDNには書いてあるし、他のヘルプでもちゃんとしたものなら説明があるはずなのですが。

私がどうしても分からないのは*の意味です。
ヘルプを見ても分かりませんでした。
ヘルプを見て分かるのは分かっている人の理屈で、分からない人にとっては残念ながら分かりません。

このような場で皆さんから色々このようなことで指摘される位なら、
当然へルプで調べます。

でも、分からないので質問しました。
これは学校の宿題でも何でもありません。
私が知りたいと思ったから質問しました。
色々言われるだろうことは分かった上で。

あるプログラミングで著名な人も言っていました。若かりしころ、
会社の先輩に分からないことを聞いたら、へルプぐらい調べろと怒られて、
心の中で、
”調べても分からないから、聞いてるんだよぉぉぉぉぉぉぉぉぉぉ〜〜”
と叫んだと。

*はポインタのことかと思っていたのですが、結局、ある人に聞いてワイルドカードだとようやく分かり理解できました。

>ですがかずまさんのように、ソースをわざわざ作ってくれる人も多いので、
>この掲示板ではそのような質問も構わないのかもしれません。

生意気なようですが、皆さんがいろいろ書かれているより、かずまさんの
コードの方が短いですよね。

>ただ、次回は"初心者"とか"学生"とかいうハンドルネームはやめてね、
>くらいは言ってもいいでしょうか。

ささやかな質問者側の反抗です。
今回はお許しください。

色々書きましたが、質問者の思いも分かってほしかったのです。
悪気は有りません。ご無礼お許しください。


No.789

Re:1バイト文字と2バイト文字を取り出すには
投稿者---RAPT(2003/12/02 22:04:15)


> *はポインタのことかと思っていたのですが、結局、ある人に聞いて
> ワイルドカードだとようやく分かり理解できました。

違います。
printf()の書式指定子において、* は特別な意味を持ちます。

* は最小フィールド幅を、int型の引数で指定します。
. は精度です。必ず、直後で指定したサイズのフィールド幅で出力します。

----- ここから -----
char *s = "ABCDEFG";
printf("[%s]\n", s);      /* [ABCDEFG] */

printf("[%2s]\n", s);     /* [ABCDEFG] 最小フィールド幅は無意味 */
printf("[%*s]\n", 2, s);  /* [ABCDEFG] 上と同じこと */

printf("[%.2s]\n", s);    /* [AB] 精度が適用される */
printf("[%.*s]\n", 2, s); /* [AB] 上と同じこと */
----- ここまで -----

平林雅英著(1988)「ANSI C言語辞典」初版 p.351 出力変換仕様
より一部引用(一部変更)

今は上記の第2版が出ていたと思います。
1冊手元に置いておくと良いでしょう。


No.792

Re:1バイト文字と2バイト文字を取り出すには
投稿者---超初心者(2003/12/04 06:25:29)


お礼遅くなりました。回答ありがとうございます。
大変詳しく説明頂き良くわかりました。

>平林雅英著(1988)「ANSI C言語辞典」初版 p.351 出力変換仕様
>より一部引用(一部変更)

今度本屋で覗いてみます。