从程序的健壮性考虑,当要求用户输入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 }
@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界面进行的,比较原始,没有各种控件和事件,所以没办法完成。