2013-04-18 55 views
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或功能代号”我真的坚持在这里,任何帮助赞赏。

+1

你是不是指'&&'不是'&'? –

+0

请保持习惯于复制和粘贴编译器消息,而不是自己重新输入它们。这样,你会正确得到*左值*而不是* Ivalue *。这是小写的el,不是资本i。 –

回答

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; 
+0

当我这样做时,我得到“错误:预期的表达式” –

+0

@Danger_Fox看到更新后的帖子,因为你的()不匹配 – taocp

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))); 
} 
1

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

编译器看到以此为条件进行测试:

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

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

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

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

仔细阅读错误消息和代码将帮助您下次找到这种错误。 (也就是说,当编译器抱怨缺少一个“左值或函数指示符”时,问问自己什么会使它期望这样的事情,它首先需要那些东西,所以考虑为什么它认为它你应该有一个二元运算符,所以仔细看代码以确定为什么它不被解释为二元运算符,你知道C++语法,所以你知道if声明必须是整个括号中,所以你知道只有第一个表达式是条件的一部分。这不是你想要的,所以你会意识到右括号是错误的)

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

相关问题