ファイルの内容を入力として使用し、オペランド、括弧、および演算子を分離しようとしています。入力ファイルには 2 行の入力が含まれているため、2 行の値を混同したくないため、一度に値ではなく行全体を読み取る必要があると考えました。やろうと思っていたのは
- getline を使用して、一度に 1 行ずつ入力という文字列変数に格納します。
- 文字列 (空白を区切り文字として使用) をセグメントに分割し、それらを tempContainer というスタックにプッシュします。
- tempContainer.top() を一時変数に格納し、tempContainer.pop() を呼び出します
- 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++++++++++++++++++++++
}
}
}
}
エラーを追跡するのを手伝ってもらえますか? お時間をいただきありがとうございます!