У меня есть код калькулятора, в котором мне нужно сохранить заданную строку (по одной строке в калькуляторе времени) на основе определенного символа, такого как «М», присутствующего в конце строки.Кроме того, если где-либо в строке есть буква «M», то вместо этой буквы M добавьте последнюю сохраненную строку.
Я думал, что это можно легко сделать с помощью (псевдокода),
foreach input element
if input element == 'M' && is last element
save = true
erase M element
if input element == 'M' && save != true
insert saved string into input
erase 'M' from input
if save == true
Set save string = input;
Я пытаюсь сделать это в методе ниже, но он не работает.Я не уверен, где или как сохранить строку, чтобы она не сбрасывалась в каждой строке.Я получаю "строковый индекс вне диапазона" (в другом классе, но из-за этого изменения), когда я пытаюсь использовать 'M' в конце ввода.
const string operators = "*/+-";
const string memorize = "M";
list<string> lex(string input)
{
list<string> tokens;
bool save = true;
string saveInfo = "2";
string token;
for (unsigned int i = 0; i < input.length(); i++)
{
// Check if we need to save string element to memory
if ((memorize.find(input[i]) != string::npos) && (i == input.length() - 1))
{
save = true;
// Remove 'M' from end of string
input.erase(i);
}
// Check if 'M' is element
if (memorize.find(input[i]) != string::npos && !save)
{
// Insert saved string
input.insert(i, saveInfo);
// Remove M from string
input.erase(i);
}
// Save input
if (save)
{
saveInfo = input;
}
if (operators.find(input[i]) != string::npos)
{
// Add any token we've created so far
if (token.length())
{
tokens.push_back(token);
token.clear();
}
// Add this operator as a separate token
token.push_back(input[i]);
tokens.push_back(token);
token.clear();
}
else
{
// Grow the current token
token.push_back(input[i]);
}
}
// Any stragglers?
if (token.length())
{
tokens.push_back(token);
}
// Clean 'em up
for (list<string>::iterator i = tokens.begin(); i != tokens.end(); ++i)
{
*i = clean(*i);
}
return tokens;
}
saveInfo
в настоящее время просто устанавливается на «2» каждый раз, пока я не выясню, где должна находиться моя строковая переменная, чтобы каждый раз сохранять сохраненный экземпляр строки.
Этоправильный способ решить эту проблему?Есть ли способ лучше?Знаете ли вы, почему это не работает?
РЕДАКТИРОВАТЬ:
пример ввода:
INPUT: 2+1M
OUTPUT: 3 **2+1 is saved
INPUT: M+5 **2+1 is inserted into this input string at 'M'
OUTPUT: 8
Я не работал с C ++ вдолгое время, любая помощь приветствуется!