堆栈声明分段错误

时间:2011-11-11 16:30:32

标签: c++

只是我的练习。 //读取一个带有“()”的句子,用“(删除)”替换()中的所有内容。

1)将句子读成矢量。

2)将矢量堆叠成堆栈> 3)找到两者的位置“(”    和“)”
4)删除元素并替换为“(删除)”    矢量
5)输出向量。

即。输入“这是(a)duck”,输出应为“this is(deleted)duck”。提前谢谢。

#include <iostream>
#include <stack>
#include <string>
#include <vector>
using namespace std;
int main ()
{
    cout<<"please enter a series of words with parenthes"<<endl;
    vector<string> svec;
    string word;
    while (cin>>word)
        svec.push_back(word);
    stack<string, vector<string> > strStack(svec);
    vector<string>::iterator pos1 ,pos2;
    for (vector<string>::iterator counter=svec.end(); strStack.empty()==false; --counter)
    {
        if(strStack.top()==")") pos1=counter-1;
        if(strStack.top()=="(") { pos2=counter-1; break; }
        strStack.pop();     
    }
    svec.insert(svec.erase(pos2,pos1),"(deleted)");
    for(vector<string>::iterator iter=svec.begin(); iter!=svec.end(); )
        cout<<*iter++<<" "<<flush;
return 0;
}

对不起。输出是:我认为问题是堆栈&gt; strStack(SVEC); 因为我无法堆叠;上面的代码应该没问题(我知道了);

please enter a series of words with parenthes
this is (a) duck
Segmentation fault

1 个答案:

答案 0 :(得分:2)

你的代码被破坏了:它只处理一些非常具体的案例,即当只有一个括号的单个单词时。如果做不到这一点,你永远不会分配pos1pos2,导致我们心爱的“未定义的行为”。

至少,确保您永远不会使用未初始化的变量(#1)。作为奖励,我们检查是否有匹配(#2):

vector<string>::iterator pos1 = svec.end(), pos2 = pos1; // #1: never uninitialized

// ...

if (pos1 != pos2)   // #2: only if we found something
    svec.insert(svec.erase(pos2,pos1),"(deleted)");