isnum

从程序的健壮性考虑,当要求用户输入int型数据时,他可能会无意输入字母等其他数据,这时候,程序很可能就崩掉,为了防止程序崩掉,必须严格控制用户输入(类似于java中的正则表达式)

我需要一次性获取用户当前输入(他输入的可能是1位数也可能是2位数或者字母等)并判断是否为严格意义上的数字,主要是为了区分数字和字母。如果不是数字则返回重输,如果是,使用该int 型数据做其他操作。

判断过程用bool型自定义函数实现。

望有心人士给予解决方法,不胜感激

C++
vamlichunyan的主页 vamlichunyan  |  初学一级  | 园豆: 195
提问于:2012-03-08 22:49
最佳答案
0
 1 bool is_number(char *str)
 2 {
 3     char *p = str;
 4     // 0123
 5     if(*p == '0' && *(p+1) != '\0')
 6         return false;    
 7     while(*p != '\0')
 8     {
 9         if(*p <= '0' && *p >= '9')
10             return false;
11         p++;
12     }
13     return true;
14 }
收获园豆: 5
hustor  |  菜鸟二级  |园豆:220  | 2012-03-09 14:21
灰常感谢你给出解决方案。
你的思路是不是采用二级指针实现?
按照你的代码我用下面的main()调用了一下发现不论我输入数字还是字母,输出均是“你输入的数是数字”,which means
is_number没有起到区分数字跟字母的作用。我不明白的是
(*p <= '0' && *p >= '9')这个判断条件,*p貌似不可能既<='0'又>='9'吧?我试图将&&改成||,可是结果变成了无论我输入的是数据还是字母,输出结果均是“你输入的数不是数字!”还是不能达到预期结果。是不是我的参数传递有问题?能把代码解释解释一下吗?
#include <iostream>
using namespace std;
 bool is_number(char *str)
  {
      char *p = str;
      // 0123
      if(*p == '0' && *(p+1) != '\0')
          return false;    
      while(*p != '\0')
      {
          if(*p <= '0' && *p >= '9')
             return false;
         p++;
     }
     return true;
}
void main()
{
    cout<<"请输入数据"<<endl;
    char string;
    cin>>string;
    char *pt=&string;
    if(is_number(pt)){cout<<"你输入的数是数字!";}
    else{cout<<"你输入的数不是数字!";}
}
vamlichunyan  | 园豆:195  (初学一级)  | 2012-03-09 22:32

@vamlichunyan: 对,我那个判断条件打错了 - -!, 至于你改对后测试为什么还是错的,那是因为你使用的是char,它是字符而不是字符串呀,所以你输入12345,string=‘1’,这时对于一个字符,它没有空字符'\0',所以while那个判断条件失效了  建议你使用char *,或者string

hustor  | 园豆:220  (菜鸟二级)  | 2012-03-09 23:29

@vamlichunyan: 

 1 #include <iostream>
 2 #include <string>
 3 using namespace std;
 4 bool is_number(char *str)
 5 {
 6     char *p = str;
 7     // 0123
 8     if(*p == '0' && *(p+1) != '\0')
 9         return false;    
10     while(*p != '\0')
11     {
12         if(*p <= '0' || *p >= '9')
13             return false;
14         p++;
15     }
16     return true;
17 }
18 bool is_number(string str)
19 {
20     string::iterator it = str.begin();
21     if(*it == '0' && str.length() > 1)
22         return false;
23     for( ; it<str.end(); it++)
24     {
25         if(*it <'0' || *it > '9')
26             return false;
27     }
28     return true;
29 }
30 int main()
31 {
32     /*char *str = new char[100];
33     cin >> str;
34     cout << is_number(str);
35     return 0;*/
36     string str;
37     cin >> str;
38     cout << is_number(str);
39     return 0;
40 }
hustor  | 园豆:220  (菜鸟二级)  | 2012-03-09 23:45

@hustor: 索滴斯列~~我很喜欢你给的方案。抱歉这么晚才回复,我以为系统会给我发提醒邮件,所以。。。。

不过白费周折我编写了另一种方法,不仅能识别正数,还能识别负数,呵呵。和你分享一下:

主要思路是采用string类的成员函数c_str()实现。对于成功判断是数字以后如果要使用该数字可以再调用atoi(const char*s)

#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
 bool is_number(string str)
  {
     if(str.c_str()[0]!=45)
     {
        for(int i = 0; i < str.length(); i++)
        {
           if( str.c_str()[i] < '0' || str.c_str()[i] > '9' )
           { return false;}
         }
        return true;
     }
     else
     {
       for(int i = 1; i < str.length(); i++)
        {
           if( str.c_str()[i] < '0' || str.c_str()[i] > '9' )
           { return false;}
        }
       return true;
     }
 }

void main()
{ int a=0;
  const char *s;
  cout<<"请输入数据a:";
  string str;
  cin>>str;
  if(is_number(str))
  {
    cout<<"你输入的是数字!"<<endl;
    s=str.c_str();
    a=atoi(s);
    a=a+1;
    cout<<"a+1="<<a<<endl;
  }
  else cout<<"你输入的不是数字!";
}


vamlichunyan  | 园豆:195  (初学一级)  | 2012-03-13 23:33

@hustor: 不过回过头来看发现我的方法跟你的is_number(string str)类似。。。。灰常感谢

vamlichunyan  | 园豆:195  (初学一级)  | 2012-03-13 23:44
其他回答(1)
0

你可以把Edit Control设置为只允许输入数字(Number = True)。

你也可以通过WM_CHAR事件来判断用户每一次的输入。

解决一次性获取用户输入的关键在于你如何界定用户已经完成输入,比如用户在3秒内未输入字符,又或者用户输入了回车键等。通常我们会使用EN_KILLFOCUS事件来标识用户已经完成输入,然后获取输入值加以验证。

Launcher  | 园豆:19811  (专家六级)  | 2012-03-09 09:18

非常感谢你的回复。你所给的方案在MFC中可以很方便地实现,但是我想采用Visual Studio 6.0 的Win32 Console Application建立工程,即程序运行期间,用户的输入是在dos界面进行的,比较原始,没有各种控件和事件,所以没办法完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值