2010-08-31 35 views
0

我使用此代碼來代替,而空間,但它永遠不會取代所有的白色空間可以ü請告訴我,我錯了代替空格++提高問題

#include <iostream> 
#include <string> 
#include <boost/regex.hpp> 
#include<boost/algorithm/string.hpp> 
#include<boost/algorithm/string/replace.hpp> 

using namespace std; 

int main(void) 
{ 
     string s4="Hai ad      asdasd      asdasd"; 
     cout << boost::algorithm::replace_all_copy(s4, " ", " "); 
} 
+0

看起來工作得很好,我... – Potatoswatter 2010-08-31 06:48:35

回答

0

如果您想徹底消除空白,最後的參數應該是空字符串。

 cout << boost::algorithm::replace_all_copy(s4, " ", ""); 
+0

雅那是正確的傻.... – bingoa 2010-08-31 06:52:13

+0

如果答案解決你的問題,你能接受它,以便其他人可以把這個問題作爲解決,可以看看他們是否有同樣的問題,他們可以做什麼。 :) – Exa 2010-08-31 07:30:04

+0

@bingoa:...也就是說,點擊您最喜歡的答案左上角的綠色複選標記。 – Potatoswatter 2010-08-31 07:44:52

1

您的代碼會用一個空格替換每個出現的4個空格。由於4個空白圖案有多處出現,您再次在輸出中會出現多個(單個)空白區域。

我不知道你想達到什麼。但要清除所有空白區域,最好使用erase_all_copy()。或者要清除所有4個空格的出現,你應該遵循Potatoswatters的建議。

#include <iostream> 
#include <string> 
#include<boost/algorithm/string/replace.hpp> 
#include <boost/algorithm/string/erase.hpp> 

using namespace std; 

int main(void) { 
     string s4="Hai ad      asdasd      asdasd"; 

     cout << boost::algorithm::erase_all_copy(s4, " ") << endl; 
     cout << boost::algorithm::replace_all_copy(s4, " ", "") << endl; 
} 

或者,您的目標是刪除單詞之間的所有空格,除了一個?

1

流運營商刪除多餘的空格自動

#include <iostream> 
#include <string> 
#include <sstream> 
#include <iterator> 
#include <algorithm> 

using namespace std; 

int main() // Note: main(void) is not valid 
{ 
    string s4="Hai ad      asdasd      asdasd"; 


    // Technique 1: Simple 
    std::stringstream s4Stream(s4); 

    std::string s5; 
    std::string word; 
    while(s4Stream >> word) 
    { 
     s5.append(word).append(" "); 
    } 
    std::cout << s4 << "\n" << s5 << "\n"; 


    // Technique2: Using STL algorithms 
    std::stringstream s4bStream(s4); 
    std::stringstream s5bStream; 

    std::copy(std::istream_iterator<std::string>(s4bStream), 
       std::istream_iterator<std::string>(), 
       std::ostream_iterator<std::string>(s5bStream," ") 
      ); 

    std::string  s5b = s5bStream.str(); 
    std::cout << s4 << "\n" << s5b << "\n"; 
} 
+0

+1:我會冒昧(即使不明確)這個想法是刪除虛假的空白,同時仍然保持單詞分開。 – 2010-08-31 08:19:22

+0

@Matthieu M:就像上面的代碼一樣。注意(技巧1):附加(「」)。注意(技巧2):std :: ostream_iterator()需要兩個參數一個流和一個分隔符s5bStream,「」。 – 2010-08-31 08:38:36

+0

這正是爲什麼我upvoted你:)我的評論可能不清楚:/ – 2010-08-31 08:46:37

1

如果這個想法是用一個空格來代替任意數量的空格,那麼標準unique(_copy)算法可以被欺騙,要做到這一點:

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iterator> 
#include <boost/lambda/lambda.hpp> 

std::string remove_excessive_spaces(const std::string& s) 
{ 
    using namespace boost::lambda; 
    std::string result; 
    //consider consequtive chars equal only if they are both spaces. 
    unique_copy(s.begin(), s.end(), back_inserter(result), _1 == ' ' && _2 == ' '); 
    return result; 
} 

int main(void) 
{ 
    std::string s4="Hai ad      asdasd      asdasd"; 
    std::cout << remove_excessive_spaces(s4); 
}