从程序的健壮性考虑,当要求用户输入int型数据时,他可能会无意输入字母等其他数据,这时候,程序很可能就崩掉,为了防止程序崩掉,必须严格控制用户输入(类似于java中的正则表达式)
我需要一次性获取用户当前输入(他输入的可能是1位数也可能是2位数或者字母等)并判断是否为严格意义上的数字,主要是为了区分数字和字母。如果不是数字则返回重输,如果是,使用该int 型数据做其他操作。
判断过程用bool型自定义函数实现。
望有心人士给予解决方法,不胜感激
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 }
灰常感谢你给出解决方案。
你的思路是不是采用二级指针实现?
按照你的代码我用下面的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: 对,我那个判断条件打错了 - -!, 至于你改对后测试为什么还是错的,那是因为你使用的是char,它是字符而不是字符串呀,所以你输入12345,string=‘1’,这时对于一个字符,它没有空字符'\0',所以while那个判断条件失效了 建议你使用char *,或者string
@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: 索滴斯列~~我很喜欢你给的方案。抱歉这么晚才回复,我以为系统会给我发提醒邮件,所以。。。。
不过白费周折我编写了另一种方法,不仅能识别正数,还能识别负数,呵呵。和你分享一下:
主要思路是采用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<<"你输入的不是数字!";
}
@hustor: 不过回过头来看发现我的方法跟你的is_number(string str)类似。。。。灰常感谢
你可以把Edit Control设置为只允许输入数字(Number = True)。
你也可以通过WM_CHAR事件来判断用户每一次的输入。
解决一次性获取用户输入的关键在于你如何界定用户已经完成输入,比如用户在3秒内未输入字符,又或者用户输入了回车键等。通常我们会使用EN_KILLFOCUS事件来标识用户已经完成输入,然后获取输入值加以验证。
非常感谢你的回复。你所给的方案在MFC中可以很方便地实现,但是我想采用Visual Studio 6.0 的Win32 Console Application建立工程,即程序运行期间,用户的输入是在dos界面进行的,比较原始,没有各种控件和事件,所以没办法完成。