这是在vc++6.0下,我写的一个对字符串的字符合法性的判断,
我的本意是把字符串放到一个数组里,然后给数组一个指针变量,
利用指针遍历数组里的每一个字符,看是否符合要求
/* //把字符串放到数组里
//m_strSysUser_Add_Account 是CString 变量
char SysUserAccount[32] , *ps;
ps = SysUserAccount;
strcpy( SysUserAccount,( LPCSTR )m_strSysUser_Add_Account); 
//合法性判断
int i;
for ( i=0;i<m_strSysUser_Add_Account.GetLength();i++)
{
//测试用-----------------//
                  int result
result=( 'a' < *ps < 'z' );
                  //-----------------------//
if(('a'<*ps<'z')||('A'<*ps<'Z')||('0'<*ps<'9')||(*ps=='-'))
ps++;
else 
{
MessageBox( "登录账号不能为特殊字符!" );
return;
}
}
*/
但是不管*ps取到的字符是什么,
result=( 'a' < *ps < 'z' );
result返回的都是1.比如我输入'1*&Aa',不管哪个字符比较,返回的result都是1.

解决方案 »

  1.   

    if(('a'<*ps<'z')||('A'<*ps<'Z')||('0'<*ps<'9')||(*ps=='-'))
    改为
    if(('A'<*ps && *ps<'z')||('0'<*ps && *ps<'9')||(*ps=='-'))
    就行了
      

  2.   

    不好意思,写错了
    if(('a'<*ps<'z')||('A'<*ps<'Z')||('0'<*ps<'9')||(*ps=='-'))
    改为
    if(('a'<*ps && *ps<'z')||(('A'<*ps && *ps<'Z')||('0'<*ps && *ps<'9')||(*ps=='-'))
    就行了
      

  3.   

    非常感谢abelchen!
    这样做确实是可以的,可是这种写法为什么?能不能解释一下?
    ('a'<*ps && *ps<'z')
    为什么要写成
    *ps && *ps
    这样呢?
      

  4.   

    C++里这种条件表达式是不能连续写的,必须拆分成两部分,按照逻辑关系添加逻辑运算符。如果连续写"'a'<*ps<'z'"这个式子是分两步运算的。首先运算'a'<*ps的值,返回一个bool型的结果,bool型只有'0'(表示假)或'1'(表示真)两种结果。第二步再用这个bool值与'z'比较,不管是0还是1都比'z'小,所以你这个表达式一直返回一个表示'真'的结果。
      

  5.   

    楼上解释的超清楚,辛苦了.问题出来了,当我输入大写的时候还是有问题.
    比如让这个串为AAA???????