No.13709![]() |
半角カナについて 投稿者---たかはし(2004/04/23 17:07:02) |
||
こんにちは。C言語ど素人のたかはしです。 DOSプロンプトから文字を受け取って、それをif文で判定して、条件にそっていれば(例えば半角英数字8文字以内)、処理をするプログラムを作っています。 そのif文の判定に関してわからないことがあります。 今、半角カナ以外の場合は処理を続けるようにしたいのですが、どうもうまくいきません。 if ((0x21==*(p+i)) && (0x5F==*(p+i))) printf("\n***半角カナ以外を入力してください***\n\n"); 上記のように作っていますが、全角文字もこの条件文を通ってしまいます。 文字コード JIS7です。全角の文字コードは0x21〜0x7Eなので、上記の条件文ではだめなのはわかっていますが、同様にしたらいいかわからなくて困っています。 何かよい方法はありますでしょうか? 宜しくお願いします。 |
No.13710![]() |
Re:半角カナについて 投稿者---YuO(2004/04/23 17:41:12) |
||
まともな用語を使ってください。 「半角カナ」とは何ですか? とりあえず,JIS X 0201で定義される「片仮名用図形文字集合」と仮定します。 「JIS7」とは何ですか? とりあえず,JIS X 0202を7bit系で使い, さらにGLにG0を呼び出した状態で使い, 文字集合は全てG0のみに呼び出すものと仮定します。 >今、半角カナ以外の場合は処理を続けるようにしたいのですが、どうもうまくいきません。 >if ((0x21==*(p+i)) && (0x5F==*(p+i))) >printf("\n***半角カナ以外を入力してください***\n\n"); p及びiの型は何ですか? まぁ,どちらにしてもこの条件文は常に偽となりますが。 p[i]が0x21であれば,0x5F == *(p + i)は常に偽ですし, p[i]が0x5Fであれば,0x21 == *(p + i)は常に偽です。 >上記のように作っていますが、全角文字もこの条件文を通ってしまいます。 >文字コード JIS7です。全角の文字コードは0x21〜0x7Eなので、上記の条件文ではだめなのはわかっていますが、同様にしたらいいかわからなくて困っています。 >何かよい方法はありますでしょうか? JIS X 0201の片仮名用図形文字集合をG0に呼び出すエスケープシーケンスESC 2/8 4/9が見つかるか, JIS X 0201の片仮名用図形文字集合を呼び出した領域をGLに呼び出すシーケンスが見つかった後, 他の文字集合がGLに呼び出すシーケンスが見つかるまでにGLの文字を利用した場合, というのがエラー条件だと思います。 JIS X 0202は基本的に状態を持つので, ちゃんと状態管理をしてやればそれほど難しくないと思いますよ。 |
No.13772![]() |
Re:半角カナについて 投稿者---たかはし(2004/04/26 17:00:36) |
||
>JIS X 0201の片仮名用図形文字集合をG0に呼び出すエスケープシーケンスESC 2/8 4/9が見つかるか, >JIS X 0201の片仮名用図形文字集合を呼び出した領域をGLに呼び出すシーケンスが見つかった後, >他の文字集合がGLに呼び出すシーケンスが見つかるまでにGLの文字を利用した場合, >というのがエラー条件だと思います。 ↑ どのようにしてやるんでしょうか? ちょっとまだエスケープシーケンスとかよくわかってないので、 できれば具体的に教えていただけるとありがたいです。 すいませんが、宜しくお願いします。 |
No.13711![]() |
Re:半角カナについて 投稿者---Cマニア(2004/04/23 17:50:08) |
||
>if ((0x21==*(p+i)) && (0x5F==*(p+i))) >printf("\n***半角カナ以外を入力してください***\n\n"); ↑は、*(p+i)が 0x21 かつ 0x5F という式で、 これが真になることはあり得ないんじゃないかなと思います(^_^;) それから半角カナの文字コードは何でしょうか??? 半角カナを0x21〜0x5Fまでだと仮定すると、 if( (*(p+i) >= 0x21) && (*(p+i) <= 0x5F) ){ printf("\n***半角カナ以外を入力してください***\n\n");こんな感じでできると思いますよ。 これは、*(p+i)が0x21以上で、0x5F以下という式です。 |
No.13765![]() |
Re:半角カナについて 投稿者---たかはし(2004/04/26 09:06:09) |
||
回答ありがとうございます。 すいません、まだ初心者なもので、用語をしっかりと把握してませんでした。 また質問するかもしれませんので、宜しくお願いします。 |