1

我有一个函数用于尝试检查字符串的格式是否正确。我试图通过查看每个字符并确定它是否属于正确的类型来做到这一点。但是,无论我尝试什么,我都会得到一个我无法弄清楚的错误。代码如下:

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 或函数指示符”我真的被困在这里,感谢任何帮助。

4

3 回答 3

3
 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;
于 2013-04-18T17:10:15.050 回答
3
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)));
}
于 2013-04-18T17:11:44.907 回答
1

你的错误的原因是你的括号在错误的地方。编译器&抱怨的在语句的条件表达式之外if

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

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

剩下的部分被认为是条件为真时要执行的语句:

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

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

仔细阅读错误信息和代码将有助于您下次发现此类错误。(也就是说,当编译器抱怨缺少“左值或函数指示符”时,首先问问自己是什么让它期望这样的事情。它在获取某物的地址时想要那些,所以考虑一下它为什么认为它应该获取任何东西的地址。它使用一元运算&符来实现,但您打算使用二元运算符,因此请仔细查看代码以确定为什么它不被解释为二元运算符。您知道 C++ 语法,所以您知道声明if需要完全括在括号中,因此您知道只有第一个表达式是条件的一部分。这不是你想要的,所以你会意识到右括号在错误的地方。)

事实上,单与号&运算符不应该用于布尔表达式。你应该&&改用。这种差异不会导致您看到的错误,也不会对代码的运行时行为产生明显影响。

于 2013-04-18T17:32:26.370 回答