NOEMBLEM/エンブレムが設定されていません。

メールの詳細(トピック表示)

数字、英大文字、英小文字の判別

投稿者:筋肉2*9=18さん  2003/12/25 21:13  MLNo.385   [メール表示]

この春からプログラマーになるC初心者です。よろしくお願いします。

ある文字列の中に、数字、英大文字、英小文字があります。これらを判別した
いのです。アスキーコードから判定しようかと思うのですが、文字をアスキー
コードにする方法がわかりません。教えてください。


このエントリーをはてなブックマークに追加


  • MLNo.387   "Isao SHIMAKURA"さん  (0) 2003/12/26 00:14  [メール表示する]
     島倉です。

     C言語で文字列とは文字コードの配列である、という回答は既に
    付いているのですが、ちょっと気になることがあります。

     is〜系の関数(ANSI準拠)を使った方が良いと思うのですが、アス
    キーコードに限定するのは興味からでしょうか。

    Isao SHIMAKURA (ISLe)
    isle.shimakura@…

    ----- Original Message -----
    From: <sawayaid@…>
    To: <beginers@…>
    Sent: Thursday, December 25, 2003 9:13 PM
    Subject: [beginers:0385] 数字、英大文字、英小文字の判別


  • MLNo.391   FUJIHARA Keiichiさん  (0) 2003/12/26 10:34  [メール表示する]
    藤原と申します。
    From: のアドレスを間違えていたので(2回も)
    改めて。

    This message is reply to sawayaid - san
    (Subject was : [beginers:0385]数字、英大文字、英小文字の判別)

    Message-ID: <2029901.1072354406852@…>
    in Thu, 25 Dec 2003 21:13:26 +0900 (JST) ...

    > この春からプログラマーになるC初心者です。よろしくお願いします。
    >
    > ある文字列の中に、数字、英大文字、英小文字があります。これらを判別した
    > いのです。アスキーコードから判定しようかと思うのですが、文字をアスキー
    > コードにする方法がわかりません。教えてください。

    本当は、島倉さんがお書きの通り、 is〜 という関数を使うのがベストです。

    ただテクニックとしては、文字の判定は(見かけ上でも)文字でやるのもいい
    方法です。

    char c; に対して、

    if ((c >= '0') && (c <= '9')) c は数字
    if ((c >= 'a') && (c <= 'z')) c は小文字
    if ((c >= 'A') && (c <= 'Z')) c は大文字

    です。

    ただし、上にも書きましたが、

    if(islower(c)) .....
    と、
    if ((c >= 'a') && (c <= 'z')) ...

    のどちらが、読んだときに「小文字の時の処理」というのが一目でわかるか
    を考えると、is〜 の関数を使うのがよいでしょう。
    上の関数は、「半角」の英数字にしか使えませんが、最近は、「全角」でも
    使えるように拡張した関数も付いていますし。




    --
    _/ -- Last 5560 hours until ATHENS 2004 Olympic Games -------------
    _/ FUJIHARA Keiichi
    _/ E-Mail : keiichi@… <or> nagi@…
    _/ URL : http://www.keiichi.fujihara.name/
    ------------------------------------------+----- Luna Phase 3.03 --
    PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6



  • MLNo.392   "Isao SHIMAKURA"さん  (0) 2003/12/26 17:53  [メール表示する]
     島倉です。

     元投稿者の方が「アスキーコードで」と書かれているので分かっ
    ていることだとは思いますが、改めて。

     ANSI規格では数字コードの連続性は保証していますが、アルファ
    ベットコードの連続性は保証していません。

     つまり、

    > if ((c >= '0') && (c <= '9')) c は数字

    はANSI準拠の処理系であれば問題ないのに対し、

    > if ((c >= 'a') && (c <= 'z')) c は小文字
    > if ((c >= 'A') && (c <= 'Z')) c は大文字

    は正しく動くかどうか分かりません。
     後者が正しいのは「アスキーコードで」という条件を満たしてい
    る場合だということは強調しておかなくてはならないと思います。

    Isao SHIMAKURA (ISLe)
    isle.shimakura@…

    ----- Original Message -----
    From: "FUJIHARA Keiichi" <nagi@…>
    To: <beginers@…>
    Sent: Friday, December 26, 2003 10:34 AM
    Subject: [beginers:0391] Re: 数字、英大文字、英小文字の判別


  • MLNo.393   FUJIHARA Keiichiさん  (0) 2003/12/26 20:38  [メール表示する]
    藤原です。

    This message is reply to Isao SHIMAKURA - san
    (Subject was : [beginers:0392] Re: 数字、英大文字、英小文字の判別)

    Message-ID: <00b901c3cb8d$9e915de0$0201a8c0@…>
    in Fri, 26 Dec 2003 17:52:20 +0900 ...

    >  島倉です。
    >
    >  元投稿者の方が「アスキーコードで」と書かれているので分かっ
    > ていることだとは思いますが、改めて。
    >
    >  ANSI規格では数字コードの連続性は保証していますが、アルファ
    > ベットコードの連続性は保証していません。

     ご指摘ありがとうございました。
     その通りですね。
     一応、意識としては、EBCDIC のような、アルファベットの間に
    「隙間」がある文字コードくらいは思い浮かべていたのですが、
    大文字・小文字がひとかたまりになっているような仮定も保証され
    ていませんというのまできがまわっていませんでした。
    ※というか、EBCID で小文字を扱うと、また別の問題があるのでした。

    >  後者が正しいのは「アスキーコードで」という条件を満たしてい
    > る場合だということは強調しておかなくてはならないと思います。

     そうですね。「文字コードに依存」というのは、強調する必要がありますね。
     この意味でも、is〜 系の関数を使うのが良いと言えます。

    --
    _/ -- Last 5550 hours until ATHENS 2004 Olympic Games -------------
    _/ FUJIHARA Keiichi
    _/ E-Mail : keiichi@… <or> nagi@…
    _/ URL : http://www.keiichi.fujihara.name/
    ------------------------------------------+----- Luna Phase 3.48 --
    PGP FingerPrint = 7CC3 4F95 8CC7 87D3 7178 C348 CD65 7F08 D68F 69F6




メールへの返信はMLのメンバーしかできません。

更新順メールリスト