我有计算器代码,我需要根据字符串末尾出现的某个字符(如“M”)保存一条给定的行(一次一行计算器)。此外,如果'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 ++,感谢任何帮助!
答案 0 :(得分:2)
首先想到的是:您在通过添加和删除项目修改序列时迭代序列。因为插入/删除后索引错误,所以必然会引起眼泪。