2013-04-18 2 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

Вы не имеете в виду '&&' not '&'? –

+0

Пожалуйста, привыкните копировать и вставлять сообщения компилятора, а не переписывать их самостоятельно. Таким образом, вы правильно получите * lvalue * вместо * 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)))... 

Таким образом, компилятор правильно , Когда он видит оператора унарный&, он ожидает, что операнд будет тем, что он может принять адрес, например, lvalue или функцию.

Тщательное считывание сообщений об ошибках и кода поможет вам найти такую ​​ошибку в следующий раз. (То есть, когда компилятор жалуется на отсутствующий «идентификатор lvalue или функции», спросите себя, что бы это заставило его ожидать такого, в первую очередь. Оно хочет тех, когда оно принимает адрес чего-то, поэтому подумайте, почему он это считает должен брать адрес чего-либо. Он делает это с унарным оператором &, но вы должны иметь двоичный оператор, поэтому внимательно посмотрите на код, чтобы определить, почему он не интерпретируется как двоичный оператор. Вы знаете синтаксис C++, поэтому вы знаете, что инструкции if должны быть полностью, окруженные в круглых скобках, и поэтому вы знаете, что только условие является частью первого выражения. Это не то, что вы намеревались, так что вы поймете, что закрывающая скобка ошибочна место.)

Как бы то ни было, оператор single-ampersand & не то, что вы должны использовать для булевых выражений. Вместо этого вы должны использовать &&. Это различие не привело бы к ошибке, которую вы видели, и это не окажет заметного влияния на поведение вашего кода во время выполнения.

Смежные вопросы