保存计算器输入并在下一行重现它的问题

时间:2011-12-02 03:06:57

标签: c++ save

我有计算器代码,我需要根据字符串末尾出现的某个字符(如“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 ++,感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

首先想到的是:您在通过添加和删除项目修改序列时迭代序列。因为插入/删除后索引错误,所以必然会引起眼泪。