簡體   English   中英

堆棧聲明分段錯誤

[英]stack declaration segmentation fault

只是我的練習。 //讀取一個帶有“()”的句子,用“(刪除)”替換()中的所有內容。

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;
}

抱歉。 輸出是:我認為問題是堆棧> strStack(svec); 因為我無法堆疊; 上面的代碼應該沒問題(我知道了);

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

你的代碼被破壞了:它只處理一些非常具體的情況,即當只有一個括號的單個單詞時。 如果做不到這一點,你永遠不會分配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)");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM