Выражение: строковый индекс вне диапазона. Атрибут прохождения вопроса?

0

Я запускаю ошибку во время выполнения моей программы:
Msgstr "Не удалось выполнить отладочную проверку!... Выражение: строковый индекс вне диапазона."

Это происходит в моем цикле for, когда оператор if пытается проверить, является ли символ в 'i' в строке isDelimiter() или isOperator(). Я передаю char 'check' как атрибут, и в комментариях я убедился, что 'check' захватывает правильный символ. Некоторое время я занимаюсь этой проблемой, и я не могу ее решить.

ИЗМЕНИТЬСЯ НА НОМЕРЕ

    string inputLine = "";
    string inputString = "";

    int main()
    {
        ifstream input("input.txt");
        getline(input, inputLine);

        if (input.is_open())
        {
            while (!input.eof())
            {
                getline(input, inputLine);

                for (int i = 0; i<inputLine.length(); i++)
                {
                    char check = inputLine[i];
                    //cout << check << "\n"; // test for correct character

                    if ((inputLine[i] != ' ') || (inputLine[i] != isDelimiter(check)) || (inputLine[i] != isOperator(check)))
                    {
                        inputString = inputString + inputLine[i];
                        //cout << lexer(inputString) << "\n";
                        //cout << inputString;
                    } // end if
                    else
                    {
                        cout << lexer(inputString);
                        if (inputLine[i] == isDelimiter(i))
                    cout << inputLine[i] + "\tDELIMITER";
                        if (inputLine[i] == isOperator(i))
                            cout << inputLine[i] + "\tOPERATOR";
                        inputString = "";
                    } // end else
                    //cout << inputString << "\n";
                } // end for
            } // end while
            //input.close();
        }
        else cout << "Unable to open file.";

        return 0;
    }

Вот методы isDelimiter() и isOperator().

    bool isOperator(char c)
    {
        if ((inputLine[c] == '+') || (inputLine[c] == '-') || (inputLine[c] == '*') || (inputLine[c] == '/') || (inputLine[c] == '=') || (inputLine[c] == '%') || (inputLine[c] == '<') || (inputLine[c] == '>'))
            return true;
        else
            return false;
    }

    bool isDelimiter(char c)
    {
        if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
            return true;
        else
            return false;
    }

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ::

Просмотрев мой код, я понял ошибку, но у меня все еще есть другая. Эта ошибка времени выполнения была вызвана тем, что в моих функциях isOperator() и isDelimiter() я проверял значение inputString [c], а не только "c". Я знаю, глупая ошибка. Однако, хотя ошибки больше нет, программа по-прежнему пропускает проверку методов isOperator() и isDelimiter() и только переходит в инструкцию else, когда она читает ''. Почему это не входит в мое выражение для операторов и разделителей?

Теги:
string
methods
char
subscript

2 ответа

1

Ваши функции принимают char, меняют их на int:

bool isDelimiter(char c) //should be int
{
    if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
        return true;
    else
        return false;
}
  • 0
    После изменения функций и атрибутов, передаваемых в ints, у меня нет ошибки, но мой код все еще пропускает оператор else, который должен быть введен, как только первый ';' читается И изначально я также передавал атрибуты в функции в виде символов, потому что это то, что нужно проверять в функциях ('+', '%' и т. Д.), Я прав? Как бы это сделать с Int?
0

Я понял это, и хотя они простые ошибки, возможно, это поможет кому-то в будущем. В конце концов, я был в тупике некоторое время.

Они были в основном просто синтаксическими ошибками, мне действительно нужно было освежить мою кодировку.

Это формат, который теперь выполняет мои функции. Заметьте, что я наконец передаю правильные значения.

    bool isDelimiter(char c)
    {
        if ((c == ';') || (c == '(') || (c == ')') || (c == ','))
            return true;
        else
            return false;
    }

И вот как я их сейчас называю. Я пытался проверить, был ли сам вход равным функции, что было бы похоже на вопрос: "helloworld" == TRUE. Очевидно, что это не сработало, и я хотел ударить себя, как только я понял это. Вот фрагмент:

            if ((inputLine[i] == ' ') || (isDelimiter(check)) || (isOperator(check)))
            {
                cout << lexer(inputString);
                if (isDelimiter(check))
                {
                    cout << inputLine[i] << "\t\tDELIMITER\n";
                }
                if (isOperator(check))
                {
                    cout << inputLine[i] << "\t\tOPERATOR\n";
                }
                inputString = "";

            } // end if
            else
            {
                inputString = inputString + inputLine[i];
            } // end else

Это решило мои основные проблемы, теперь на более крупные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню