Я сталкиваюсь с ошибкой во время выполнения моей программы:
«Ошибка отладки! … Выражение: строковый индекс вне диапазона.»
Это происходит в цикле my, когда оператор if пытается проверить, является ли символ в строке «i» isDelimiter () или isOperator (). Я передаю символ ‘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 только тогда, когда читает «». Почему это не входит в мое утверждение 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
Это решило мои основные проблемы, теперь на более крупные.