2014-01-24 54 views
1

我有這種特殊的需求,我需要刪除管道'|'的特定字符之前的所有空格字符。 我已經寫了它的測試代碼,這實際上是打印右輸出,但另外饋贈我一個核心文件:(刪除一行中的字符前的所有空格

我的代碼如下:

int main() 
{ 

    string line="1 2 |3 4| hbvhwf  wjff wenf|hjbcwbfw  ejwef efwk dfkwe|jsv      |"; 
    cout <<line<<endl; 
    string::iterator ite =(line.begin()); 

    int counter=0; 
    int index=0; 
    int start=0; 
    while(ite != (line.end())) 
    { 
     if(*ite == '|' && counter > 0) 
     { 
      line.erase(start,counter); 
      counter=0; 
      cout<<line<<endl; 
     } 
     if(ite!=line.end()) 
     { 
      if(isalnum(*ite)) 
      { 
       counter=0; 
      } 
      if(*ite==' ') 
      { 
       if(!counter) 
       { 
        start=index; 
       } 
       counter++; 
      } 
      ite++; 
      index++;   
     } 
    } 

    cout<<line<<endl; 
} 

我只想堅果中發現的根。核心轉儲的原因 有誰請幫助 預期成果是:

1 2|3 4| hbvhwf  wjff wenf|hjbcwbfw  ejwef efwk dfkwe|jsv| 
+1

一旦你調用擦除你行,你需要重新設置迭代器。 – dwxw

+0

我認爲應該自動完成。就我的理解而言,我不必這麼做。 – user1939168

+0

@ user1939168 ['std :: string :: erase'](http://en.cppreference.com/w/cpp/string/basic_string/erase)返回一個迭代器。您應該將其分配給代碼中的'ite'。 – rubenvb

回答

1

正如Krzysztof的回答所說,核心轉儲的原因是erase()使迭代器無效。爲了解決這個問題,你需要正確地重置迭代器,使用erase()range version,你將得到一個迭代器,它指向現在佔據第一個字符擦除位置的字符,並將它分配給ite。將第一個if語句更改爲下面的代碼,它應該可以正常工作。

if(*ite == '|' && counter > 0) 
    { 
     ite = line.erase(ite - counter, ite); 

     counter=0; 
     cout<<line<<endl; 
    } 
+0

謝謝。這正是我所期待的。 – user1939168

1

在一根繩子上調用erase()所有迭代器失效成字符串,包括ite

具體而言,當line.erase(start,counter);執行時,ite將失效 - 不再保證引用字符串中的有效位置。如果不等於line.end(),則可以在條件isalnum(*ite)中取消引用。由於ite在此時失效,它可以引用已經釋放的內存(例如,如果字符串在被擦除後重新分配)。因此這條線導致段錯誤。

這是一個更簡單的代碼版本,它沒有問題。

std::string line = ...; 
unsigned space_run = 0; 

for (unsigned i = 0; i < line.size(); ++i) { 
    if (line[i] == ' ') { 
     ++space_run; 
    } else if (line[i] == '|') { 
     line.erase(i - space_run, space_run); 
     i -= space_run; 
     space_run = 0; 
    } else { 
     space_run = 0; 
    } 
} 
+0

這不起作用。 – Vijay

+0

它有一個愚蠢的錯誤,它現在應該工作。 –

+0

但是我的代碼有什麼問題?錯誤究竟在哪裏? – user1939168

0
#include <iostream> 
#include <string> 
#include <iterator> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    string line="1 2 |3 4| hbvhwf  wjff wenf|hjbcwbfw  ejwef efwk dfkwe|jsv      |"; 
    cout <<line<<endl; 

    string res; 
    size_t length = line.size(); 
    bool flag = false; 
    for (int i = length - 1; i >= 0 ; --i) 
    { 
     if (line[i] == '|') 
     { 
      res.push_back(line[i]); 
      flag = true; 
     } 
     else if (flag && line[i] == ' ') 
     { 

     } 
     else 
     { 
      res.push_back(line[i]); 
      flag = false; 
     } 
    } 

    copy(res.rbegin(), res.rend(), ostream_iterator<char>(cout, "")); 
    cout<<endl; 
} 

的輸出繼電器是:

1 2 |3 4| hbvhwf  wjff wenf|hjbcwbfw  ejwef efwk dfkwe|jsv      | 
1 2|3 4| hbvhwf  wjff wenf|hjbcwbfw  ejwef efwk dfkwe|jsv| 
相關問題