2010-08-31 2 views
0

Я использую этот код, чтобы заменить то время как пространство, но она никогда не заменит все белое пространство может у пожалуйста, скажите мне, где я ошибаюсьзаменить пробелы в строки C++ увеличить проблему

#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

ответ

0

Если вы хотите, чтобы полностью исключить пробелы, последним аргументом должна быть пустая строка.

+0

ya thats correct silly .... – bingoa

+0

Если этот ответ решает вашу проблему, вы можете принять его, чтобы другие могли рассматривать этот вопрос как решаемый и могли видеть, что они могут делать, если у них такая же проблема , :) – Exa

+0

@bingoa: ... то есть нажмите зеленую галочку в левом верхнем углу вашего любимого ответа. – Potatoswatter

1

Ваш код заменяет каждое происхождение из 4 белых пробелов одним пробелом. Так как существует многократное появление четырехкратного пробела, вы снова получаете несколько (одиночных) белых пробелов на выходе.

Я не уверен, чего вы пытаетесь достичь. Но чтобы стереть все белые пространства, вам лучше использовать erase_all_copy(). Или, чтобы стереть все вхождения из четырех белых пространств, вы должны следовать советам по 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: Я бы рискнул (хотя и не явным), что идея состоит в том, чтобы удалить ложные белые пробелы, сохраняя при этом слова друг от друга. –

+0

@ Matthieu M: Как и в предыдущем кодексе. Примечание (метод 1): добавление (""). Примечание (метод 2): std :: ostream_iterator() принимает два параметра потока и разделитель 's5bStream," "'. –

+0

Именно поэтому я поддержал вас :) мой комментарий, возможно, был неясным: / –

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); 
} 
Смежные вопросы