Замена символа C++

Это не имеет значения. интервал является ключевым словом языка и Int32 его фактический системный тип.

См. также мой ответ здесь к связанному вопросу.

8
задан Peter Mortensen 15 July 2010 в 21:33
поделиться

7 ответов

Как указано в других ответах, вы можете использовать различные методы replace . Однако у этих подходов есть обратная сторона - сканирование строки несколько раз (по одному разу для каждого символа). Я бы порекомендовал использовать ваш собственный метод замены, если вам важна скорость:

void beautify(std::string &s) {
    int i;
    for (i = 0; i < s.length(); ++i) {
        switch (s[i]) {
        case ' ':
        case ',':
        case '|':
            s[i] = '_';
        }
    }
}
9
ответ дан 5 December 2019 в 04:46
поделиться

Стандартная библиотека C ++ также имеет доступ к этим функциям без использования BOOST. См. замену C ++ Справочник . Это лучший способ? Думаю, это до обсуждения. Чтобы заменить несколько / разных символов, вам может потребоваться вызвать замену более одного раза.

#include <string>
    string& replace( size_type index, size_type num, const string& str );
    string& replace( size_type index1, size_type num1, const string& str, size_type index2, size_type num2 );
    string& replace( size_type index, size_type num, const Char* str );
    string& replace( size_type index, size_type num1, const Char* str, size_type num2 );
    string& replace( size_type index, size_type num1, size_type num2, Char ch);

    string& replace( iterator start, iterator end, const string& str );
    string& replace( iterator start, iterator end, const Char* str );
    string& replace( iterator start, iterator end, const Char* str, size_type num );
    string& replace( iterator start, iterator end, size_type num, Char ch );
    string& replace( iterator start, iterator end, input_iterator start2, input_iterator end2 );

Пример программы :

// replacing in a string
#include <iostream>
#include <string>
using namespace std;

int main ()
{
  string base="this is a test string.";
  string str2="n example";
  string str3="sample phrase";
  string str4="useful.";

  // function versions used in the same order as described above:

  // Using positions:                 0123456789*123456789*12345
  string str=base;                // "this is a test string."
  str.replace(9,5,str2);          // "this is an example string."
  str.replace(19,6,str3,7,6);     // "this is an example phrase."
  str.replace(8,10,"just all",6); // "this is just a phrase."
  str.replace(8,6,"a short");     // "this is a short phrase."
  str.replace(22,1,3,'!');        // "this is a short phrase!!!"

  // Using iterators:                      0123456789*123456789*
  string::iterator it = str.begin();   //  ^
  str.replace(it,str.end()-3,str3);    // "sample phrase!!!"
  str.replace(it,it+6,"replace it",7); // "replace phrase!!!"
  it+=8;                               //          ^
  str.replace(it,it+6,"is cool");      // "replace is cool!!!"
  str.replace(it+4,str.end()-4,4,'o'); // "replace is cooool!!!"
  it+=3;                               //             ^
  str.replace(it,str.end(),str4.begin(),str4.end());
                                       // "replace is useful."
  cout << str << endl;
  return 0;
}
0
ответ дан 5 December 2019 в 04:46
поделиться

Вы можете использовать стандартный алгоритм replace_if , за исключением того, что предикат довольно сложен (должен быть выражен встроенным в текущий стандарт C ++ и без лямбда).

Вы можете написать свой собственный или использовать ] is_any_of из строковых алгоритмов boost, поэтому:

#include <algorithm>
#include <string>
#include <boost/algorithm/string/classification.hpp>
#include <iostream>

int main()
{
    std::string s("This,Is A|Test");
    std::replace_if(s.begin(), s.end(), boost::is_any_of(", |"), '_');
    std::cout << s << '\n';
}
16
ответ дан 5 December 2019 в 04:46
поделиться

Я писал это, когда Space_C0wb0y опубликовал свой ответ, который является правильным ответом на ваш вопрос. Это немного сложнее, но обрабатывает больше возможных замен.

(извините, не скомпилировано / не протестировано)

class MyReplacer
{
  friend std::ostream& operator<<(std::ostream& os, const MyReplacer& Repl);
  public:
    MyReplacer(char c) : ch(c) {}
  private:
    char ch;
};

std::ostream& operator<<(std::ostream& os, const MyReplacer& Repl)
{
  switch (Repl.ch)
  {
    case '|':
    case ' ':
    case ',': os << '_'; break;
    default: os << Repl.ch;
  }
  return os;
}


std::ostringstream oss;
std::copy(str.begin(), str.end(), std::ostream_iterator<MyReplacer>(oss));
std::string result = oss.str();
0
ответ дан 5 December 2019 в 04:46
поделиться

Вы можете использовать STL-алгоритм replace_if .

11
ответ дан 5 December 2019 в 04:46
поделиться

boost :: replace_all (s, old, new);

2
ответ дан 5 December 2019 в 04:46
поделиться

Это имело смысл в 80-е годы, когда пользователей было немного и размер баз данных был не слишком велик. В то время было полезно хранить индексы и таблицы в разных физических томах.

Теперь есть логические тома, рейды и так далее, и нет необходимости хранить индексы и таблицы в разных табличных пространствах.

Но все табличные пространства должны управляться локально с единым размером расширений. С этой точки зрения индексы должны храниться в другом табличном пространстве, поскольку таблица с 50 столбцами может храниться в табличном пространстве с расширенным размером 5 МБ, когда табличного пространства для индексов будет достаточно 512 КБ расширенного размера.

replace_if определенно лучше. Вот пример кода более простого :

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

bool isBad(char c)
{
 const string bad_chars = "|, ";
 return (bad_chars.find(c) != string::npos);
}

int main()
{
 string str = "This,Is A|Test";

 // Replace!
 replace_if(str.begin(),str.end(),isBad,'_');

 cout<<str<<endl; 
 return 0;
}

СТАРЫЙ ОТВЕТ:

Используйте std :: replace на std :: find_first_of

3
ответ дан 5 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: