0

ファイルの内容を入力として使用し、オペランド、括弧、および演算子を分離しようとしています。入力ファイルには 2 行の入力が含まれているため、2 行の値を混同したくないため、一度に値ではなく行全体を読み取る必要があると考えました。やろうと思っていたのは

  1. getline を使用して、一度に 1 行ずつ入力という文字列変数に格納します。
  2. 文字列 (空白を区切り文字として使用) をセグメントに分割し、それらを tempContainer というスタックにプッシュします。
  3. tempContainer.top() を一時変数に格納し、tempContainer.pop() を呼び出します
  4. temp を処理して括弧をオペランドから分離し、それらを 2 つの異なる変数に格納します。

最後のデータをスタックにプッシュしようとするまで、すべてがうまくいきました。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 に答える