[英]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
你的代碼被破壞了:它只處理一些非常具體的情況,即當只有一個括號的單個單詞時。 如果做不到這一點,你永遠不會分配pos1
和pos2
,導致我們心愛的“未定義的行為”。
至少, 確保永遠不要使用未初始化的變量 (#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.