0

我正在尝试使用文件的内容作为输入和单独的操作数、括号和运算符。由于输入文件包含两行输入,我认为我应该一次读取整行而不是一个值,因为我不想混淆这两行的值。我想做的是

  1. 使用 getline 并一次将一行存储到一个名为 input 的字符串变量中
  2. 将字符串(使用空格作为分隔符)分解成段并将它们推入名为 tempContainer 的堆栈中。
  3. 将 tempContainer.top() 存储到临时变量中并调用 tempContainer.pop()
  4. 处理 temp 以将括号与操作数分开并将它们存储到两个不同的变量中。

一切都很顺利,直到我尝试将最后一个数据推入堆栈。我在调用 tempContainer.push(temp); 之前检查了这些值;一切都很好,所以我不明白为什么会出现分段错误。错误发生在运行时,而不是编译期间。

产生的输出:

A + B * (C - D * E) / F    <-----The original line to break down. Line 1
A
+
B
*
(C
-
D
*
E)
/
F
AB * CDE + (RST - UV / XX) * 3 - X5  <-----Line 2
AB
*
CDE
+
(RST
-
UV
/
XX)
*
3
-
//Segmentation fault here

这是代码(有错误的行在底部附近)

int main(int argc, char* argv[])
{
   string input, temp;
   fstream fin;
   stack<string>aStack;
   vector<string>sOutput;
   stack<string>tempContainer;
   int substr1, substr2;

   fin.open(argv[1], ios::in);
   if(!fin.good())
   {
      //...
   }
   else
   {
      while(!fin.eof())
      {
         getline(fin, input);
         cout << input << endl; //For verifying the content of input. Delete later
         if(input[0] == '\0')  //To prevent reading the last data in a file twice
         {
            break;
         } 
         else
         {
            //+++++++++++++++++++Breaking down string into sections++++++++++++++++++++
            //Storing the unprocessed segments of the original string into a stack
            //segments will be popped out later to be processed to separate parenthesis
            substr1 = 0;
            substr2 = 0;

            for(int i = 0; i < input.length(); )
            {
                while(input[i] != ' ')
                {
                   substr2++;
                   i++;
                }
                temp = input.substr(substr1, substr2 - substr1);
                substr2++;
                substr1 = substr2;
                i++;

                tempContainer.push(temp);  //ERROR here
                cout << tempContainer.top() << endl; //For testing purpose, delete later.
            }
            //+++++++++++++++++++++Finish breaking down strings++++++++++++++++++++++
         }
      }
   }
}

你能帮我找出错误吗?感谢您的时间!

4

1 回答 1

3

您需要像这样进行某种边界检查:

while(i < input.length() && input[i] != ' ')
{
   substr2++;
   i++;
}
于 2013-05-31T03:14:29.820 回答