检查字符串中每个字符的类型

Checking what type each character in a string is

本文关键字:字符 类型 字符串 检查      更新时间:2023-10-16

我有一个函数,我用它来检查字符串是否在正确的格式。我试着通过观察每个字符并确定它是否属于正确的类型来做到这一点。然而,无论我尝试什么,我得到一个错误,我不能弄清楚。代码如下:

bool valid(string checkcode)
{
    if(checkcode.length()!=6) return false;
    else if(isalpha(checkcode.at(0)))&(isalpha(checkcode.at(1)))&(isdigit(checkcode.at(2)))&(isdigit(checkcode.at(3)))&(isalpha(checkcode.at(4)))&(isalpha(checkcode.at(5))) return true;
    else return false;
}

我得到的错误是在第一个'&',它说"错误:表达式必须是一个Ivalue或函数指示符"我真的被困在这里,任何帮助是感激的。

 isalpha(checkcode.at(0)))&(isalpha(checkcode.at(1)))
                         //bit and
应该

isalpha(checkcode.at(0)))&&(isalpha(checkcode.at(1)))
                        //^^logical and

在这种情况下您需要使用logical and

你还需要确保你的括号匹配。

//better to format multiple conditions and make sure () match
if(
    (isalpha(checkcode.at(0)))
  &&(isalpha(checkcode.at(1)))
  &&(isdigit(checkcode.at(2)))
  &&(isdigit(checkcode.at(3))) 
  &&(isalpha(checkcode.at(4)))
  &&(isalpha(checkcode.at(5)))
 ) 
 return true;
bool valid(string checkcode)
{
    return checkcode.length() == 6
        && (isalpha(checkcode.at(0)))
        && (isalpha(checkcode.at(1)))
        && (isdigit(checkcode.at(2)))
        && (isdigit(checkcode.at(3)))
        && (isalpha(checkcode.at(4)))
        && (isalpha(checkcode.at(5)));
}

错误的原因是括号放错了地方。编译器报错的&if语句的条件表达式之外的

编译器将此视为要测试的条件:

if(isalpha(checkcode.at(0)))

其余部分被认为是在条件为真时执行的语句:

&(isalpha(checkcode.at(1)))...

因此,编译器是正确的。当它看到一元 &操作符时,它期望操作数是可以取其地址的东西,例如左值或函数。

仔细阅读错误信息和代码将帮助您下次发现此类错误。(也就是说,当编译器抱怨缺少"左值或函数指示符"时,问问自己是什么让它首先期望这样的事情。当它取某个东西的地址时,它需要这些,所以考虑为什么它认为应该取任何东西的地址。它使用一元&操作符来实现这一点,但是您打算使用二进制操作符,因此请仔细查看代码,以确定为什么没有将其解释为二进制操作符。您知道c++语法,因此您知道if语句需要全部用圆括号括起来,因此您知道只有第一个表达式是条件的一部分。这不是您想要的,因此您会意识到右括号放错了位置。)

实际上,单&符号&操作符不应该用于布尔表达式。您应该使用&&。这种差异不会导致您所看到的错误,而且也不会对代码的运行时行为产生明显的影响。