Кто-нибудь знает, что не так с этим циклом while? - PullRequest
0 голосов
/ 18 марта 2019

Я использую цикл while для итерации строки, если она находится внутри a-z, но она не работает? Я нахожу это странным, потому что я использую тот же метод в другой функции, кроме 0-9, и она работает просто отлично.

Это проблемный код:

int lexicalAnalyzer::analyzeIdentifiers(char* program, int eos){
location = 0;
int num = 0;
int tempNum;

while(location != eos){
    tempNum = 0; //resetting counter
    while(program[location] >= 'a' && program[location] <= 'z'){ #ERROR here Thread 1: EXC_BAD_ACCESS (code=1, address=0x101d00000)
        tempNum++; //using  tempNum to catch whether identifiers are being 
found
        location++;
    }

    if(tempNum == 1){
        //meaning only 1 char was caught
        num++;
        identifiers[0] = identifiers[0] + 1;
    }else if(tempNum > 0){
        //meaning char ident was caught
        num++;
        identifiers[1] = identifiers[1] + 1;
    }
    location++;
}//end of while
return num;
}

и это тот, который отлично работает

int lexicalAnalyzer::analyzeIntegers(char* program, int eos){
location = 0;
int num = 0;
int tempNum;

while(location != eos){
    tempNum = 0; //resetting counter
    while(program[location] >= '0' && program[location] <= '9'){
        tempNum++; //using  tempNum to catch whether integers are 
being found
        location++;
    }

    if(tempNum == 1){
        //meaning only a digit was found
        num++;
        integers[0] = integers[0] + 1;
    }else if(tempNum > 0){
        //meaning integer was caught
        num++;
        integers[1] = integers[1] + 1;
    }
    location++;
}//end of while
return num;
}

Я не уверен, что что-то не так, я не вижу, но я буквально скопировал и вставил функцию analyInteger и просто слегка изменил ее для analyIIndiers, и все же он не будет работать ??

location - это инициализированная переменная частного класса

1 Ответ

1 голос
/ 18 марта 2019

Я предлагаю следующие изменения в вашей функции.

  1. Изменить условие первого цикла while на:

    while ( location <= eos ) {
    

    это гарантирует, что цикл будет прерван, если location увеличивается в цикле так, что он пропускает eos.

  2. Измените условие внутреннего цикла while, чтобы добавить аналогичную проверку.

    while ( location <= eos &&
            program[location] >= '0' && program[location] <= '9' ) {
    
  3. Используйте std::isdigit вместо использования жестко закодированных чисел.

    while ( location <= eos && std::isdigit(program[location]) ) {
    

Дополнительная проверка для завершающего нулевого символа в program во внешнем цикле будет еще лучше.

    while ( location <= eos &&
            program[location] != '\0' ) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...