Возникли проблемы при сравнении двух символов - PullRequest
0 голосов
/ 06 мая 2019

В настоящее время я делаю целочисленный синтаксический анализатор с использованием C ++, и у меня возникают проблемы при сравнении двух символов. Я заметил, что функция atoi() разрешит строку, которая имеет символ '+' или '-', и будет соответствующим образом подписывать int на основании того, что первый символ строки равен либо '+', либо '-'. Однако у меня возникла проблема со сравнением. Цикл for просто проверит первый элемент, если это не цифра, и если это не цифра, он проверит, является ли он отрицательным или положительным символом.

Вот мой код:

for (i; i < 20 && usrIpt[i] != '\0'; ++i) {

    if (i == 0 && isdigit((unsigned char)usrIpt[0]) == 0) {
        if (usrIpt[0] != '+' || usrIpt[0] != '-') {
            isNumber = false;
            break;
        } 
    }
    else {
        if (isdigit((unsigned char)usrIpt[i]) == 0) {
            isNumber = false;
            break;
        }
    }
}

У меня возникает проблема, когда usrIpt[0] равен '+' или '-', программа не прерывается из условного if usrIpt[0] != '+' || usrIpt[0] != '-'.

1 Ответ

1 голос
/ 06 мая 2019

Цикл for просто проверит первый элемент, если это не цифра,

Во-первых, нет необходимости помещать эту проверку в цикл for. Поскольку это всегда первый проверяемый символ, этот тест можно выполнять независимо от любого цикла. Если тест пройден, то цикл проверки цифр запускается либо с индекса 1, либо с индекса 0 строки, в зависимости от того, есть знак или нет знака.

Во-вторых, ваш тест для + и - неверен. Он всегда оценивается как true.

Учитывая все это, вот переписать ваш код:

int loopstart = 0;
if ( !isdigit(usrIpt[0]) )  // not a digit, so see if it is + or -
{
    loopstart = 1;
    if (usrIpt[0] != '-' &&  usrIpt[0] != '+')
    {
       // this is not a number, so exit
    }
}

После завершения теста вы начнете цикл с первого или второго символа:

int len = strlen(usrIpt);
for (int i = loopstart; i < len; ++i )  // loopstart is either 0 or 1
{
   // now check if all digits
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...