заменить пробел в строке с ++ - PullRequest
0 голосов
/ 31 августа 2010

Я использую этот код для замены пробела, но он никогда не заменяет все пробелы. Можете ли вы сказать мне, где я не прав

#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, "    ", " ");
}

Ответы [ 4 ]

1 голос
/ 31 августа 2010

Если идея состоит в том, чтобы заменить любое количество пробелов одним пробелом, то для этого можно обмануть стандартный алгоритм 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);
}
1 голос
/ 31 августа 2010

ваш код заменяет каждый пробел 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 голос
/ 31 августа 2010

Операторы потока автоматически удаляют лишние пробелы

#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 голосов
/ 31 августа 2010

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

     cout << boost::algorithm::replace_all_copy(s4, "    ", "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...