isdigit

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ざこ

isdigit

#1

投稿記事 by ざこ » 16年前

{
    CString num;
    m_ed.GetWindowText(num);
    if(isdigit(atoi(num))==0){
           MessageBox("数字を入力せよ");
           m_ed.SetWindowText(" ");
     }
}
エデットボデックスに入力した文字列が数字じゃなければエデットボックスの中身を空にするという
簡単なプログラムですが・・例えば6を入れた場合numの中身は"6"でatoiの戻り値は6になっております。
しかしisdigitの戻り値は0になります。 何故でしょうか?

御津凪

Re:isdigit

#2

投稿記事 by 御津凪 » 16年前

isdigit が必要とする引数は文字コード値です。
この場合では数値を渡しているので、文字コードでの数字ではないと判断して 0 が返ってきます。

上記の場合の条件だと、取得した文字列の各文字に対して isdigit でチェックし、
数字かどうかを判断するといいと思います。

ざこ

Re:isdigit

#3

投稿記事 by ざこ » 16年前

ううむ、仰ってることはわかるんですがどうすればいいのかさっぱりに・・ちょっと混乱してきた。

たかぎ

Re:isdigit

#4

投稿記事 by たかぎ » 16年前

「数字」を入力させたいのか、「数値」を入力させたいのかを明確にしてください。

「数字」というのは、文字通り「数」を表す「文字」のことです。
具体的には、'0'~'9'のことです。

本当にこれでよいのですか?

ざこ

Re:isdigit

#5

投稿記事 by ざこ » 16年前

ふむふむ、'0'~'9'でいいなら全部「文字」ですよね。そうすると数値の方でしょうか。

box

Re:isdigit

#6

投稿記事 by box » 16年前

isdigit() の結果が真になるのは、引数が'0'~'9'(数字)のときです。
0~9の数値のときではありません。

ざこ

Re:isdigit

#7

投稿記事 by ざこ » 16年前

ということはatoi にするのがマズイのでしょうか? しかしisgiditの因数はint型じゃないといけないみたいですが、わかりません・・EDIT箱は文字列じゃないと使えないみたいだからEDIT箱とisdigitと併用しようとしたらどうしてもatoiにしなきゃいけない?と思うのですが、根本的にやり方変化させないとまずいのでしょうか

box

Re:isdigit

#8

投稿記事 by box » 16年前

> ということはatoi にするのがマズイのでしょうか?

そうですね。

>しかしisgiditの因数はint型じゃないといけないみたいです

引数(ひきすう)です。
isdigitの引数がint型であることは間違いありません。

アスキーコードの場合でいうと、isdigitの結果が真になるのは
'0':十進で48
'1':十進で49
...
'9':十進で57
です。

今一度、'0'と0とは異なることをご確認ください。

ibis

Re:isdigit

#9

投稿記事 by ibis » 16年前

ややこしいですけど、文字をint型として扱うことがあります。
そういう場合はatoiやsscanfのような関数で変換するのではなくて、普通にキャストすればいいです。
まぁキャスト無しでそのまま渡せることも多いですが。

たかぎ

Re:isdigit

#10

投稿記事 by たかぎ » 16年前

型がどうこういうのではなく、そもそも何をしたいのかが明確であれば、それに対して適切な回答ができるのです。

tk-xleader

Re:isdigit

#11

投稿記事 by tk-xleader » 16年前

こういうことでしょうか?
{
    CString num;
    m_ed.GetWindowText(num);
    if(isdigit(static_cast<unsigned char>(num[0]))){
           MessageBox("数字を入力せよ");
           m_ed.SetWindowText(" ");
     }
}

tk-xleader

Re:isdigit

#12

投稿記事 by tk-xleader » 16年前

あっ、数字を入力していないときだから、判定逆になってますね。
{
    CString num;
    m_ed.GetWindowText(num);
    if(!isdigit(static_cast<unsigned char>(num[0]))){
           MessageBox("数字を入力せよ");
           m_ed.SetWindowText(" ");
     }
}

ざこ

Re:isdigit

#13

投稿記事 by ざこ » 16年前

皆様ご指導ありがとうございました。tkmakwins15様の回答を拝見させていただき、キャストでしょうか、を見て
何これと思ったので知識不足なようです。キャストのやり方は把握しているつもりでしたがstatic_castというのは初めて見ました。今の私には若干難しかったようです。キャストについて勉強しなおします。ありがとうございました。

バグ

Re:isdigit

#14

投稿記事 by バグ » 16年前

ちなみに、CEditを継承して数字以外の入力を許さないクラスを作成することもできます。

<参考サイト>
http://athomejp.com/goldfish/mfc/edit/number.asp

閉鎖

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