Я запускаю ошибку во время выполнения моей программы:
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, когда она читает ''. Почему это не входит в мое выражение для операторов и разделителей?
Ваши функции принимают char
, меняют их на int
:
bool isDelimiter(char c) //should be int
{
if ((inputLine[c] == ';') || (inputLine[c] == '(') || (inputLine[c] == ')') || (inputLine[c] == ','))
return true;
else
return false;
}
Я понял это, и хотя они простые ошибки, возможно, это поможет кому-то в будущем. В конце концов, я был в тупике некоторое время.
Они были в основном просто синтаксическими ошибками, мне действительно нужно было освежить мою кодировку.
Это формат, который теперь выполняет мои функции. Заметьте, что я наконец передаю правильные значения.
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
Это решило мои основные проблемы, теперь на более крупные.