ページ 11

isdigit

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

Re:isdigit

Posted: 2009年3月04日(水) 18:31
by 御津凪
isdigit が必要とする引数は文字コード値です。
この場合では数値を渡しているので、文字コードでの数字ではないと判断して 0 が返ってきます。

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

Re:isdigit

Posted: 2009年3月04日(水) 18:45
by ざこ
ううむ、仰ってることはわかるんですがどうすればいいのかさっぱりに・・ちょっと混乱してきた。

Re:isdigit

Posted: 2009年3月04日(水) 19:04
by たかぎ
「数字」を入力させたいのか、「数値」を入力させたいのかを明確にしてください。

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

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

Re:isdigit

Posted: 2009年3月04日(水) 20:04
by ざこ
ふむふむ、'0'~'9'でいいなら全部「文字」ですよね。そうすると数値の方でしょうか。

Re:isdigit

Posted: 2009年3月04日(水) 21:20
by box
isdigit() の結果が真になるのは、引数が'0'~'9'(数字)のときです。
0~9の数値のときではありません。

Re:isdigit

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

Re:isdigit

Posted: 2009年3月04日(水) 22:22
by box
> ということはatoi にするのがマズイのでしょうか?

そうですね。

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

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

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

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

Re:isdigit

Posted: 2009年3月04日(水) 22:56
by ibis
ややこしいですけど、文字をint型として扱うことがあります。
そういう場合はatoiやsscanfのような関数で変換するのではなくて、普通にキャストすればいいです。
まぁキャスト無しでそのまま渡せることも多いですが。

Re:isdigit

Posted: 2009年3月04日(水) 23:36
by たかぎ
型がどうこういうのではなく、そもそも何をしたいのかが明確であれば、それに対して適切な回答ができるのです。

Re:isdigit

Posted: 2009年3月05日(木) 02:02
by tk-xleader
こういうことでしょうか?
{
    CString num;
    m_ed.GetWindowText(num);
    if(isdigit(static_cast<unsigned char>(num[0]))){
           MessageBox("数字を入力せよ");
           m_ed.SetWindowText(" ");
     }
}

Re:isdigit

Posted: 2009年3月05日(木) 02:04
by tk-xleader
あっ、数字を入力していないときだから、判定逆になってますね。
{
    CString num;
    m_ed.GetWindowText(num);
    if(!isdigit(static_cast<unsigned char>(num[0]))){
           MessageBox("数字を入力せよ");
           m_ed.SetWindowText(" ");
     }
}

Re:isdigit

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

Re:isdigit

Posted: 2009年3月05日(木) 09:33
by バグ
ちなみに、CEditを継承して数字以外の入力を許さないクラスを作成することもできます。

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