更改字符串C++中的多个字符

Change multiple character in a string C++

本文关键字:字符 字符串 C++      更新时间:2023-10-16

大家早上好,几天前我在想,我找不到解决方案。

我需要仅使用字符串类更改字符串中的几个字符。

我尝试使用替换功能,但只替换一个字符。

例:

原弦:"Hola Pepe, com va la vida"

输入要替换的卡特勒a e i o u输入要替换它的字符*

H * l *

P * p *, c * m v * l * v * d *

谢谢大家。

我想

说做你想做的事情的最易读方法是使用 std::transform

#include <algorithm>
...
std::set<char> vowels = {'a', 'o', 'e', 'i', 'u'};
char change_to = '*';
std::string s = "Hola Pepe, com va la vida";
auto transformation_operation = [vowels, change_to](char c)
{
    return vowels.count(c) ? change_to : c;
};
std::transform(s.begin(), s.end(), s.begin(), transformation_operation);

这里transformation_operation是一个lambda,它实际上以理想的方式转换一个char(如果你愿意,可以以函数或类的形式实现)。为此,它使用捕获的一组vowels和字符change_to。为了添加更多详细信息,它会检查该字符是否存在于vowels集中,如果存在,则返回 change_to ,如果不存在,则返回原始字符。

std::transforms.begin()s.end()的每个元素调用此lambda,并将结果从s.begin()开始,即就地存储。

我建议使用std::string的方法find_first_of

例如

#include <iostream>
#include <string>
int main()
{
    std::string s("Hola Pepe, com va la vida");
    std::string t("aeiou");
    char c = '*';
    std::cout << s << std::endl;
    for (std::string::size_type pos = 0;
        (pos = s.find_first_of(t, pos)) != std::string::npos;
        ++pos)
    {
        //s.replace(pos, 1, 1, c);
        s[pos] = c;
    }
    std::cout << s << std::endl;
}

程序输出为

Hola Pepe, com va la vida
H*l* P*p*, c*m v* l* v*d*

如果要使用标准算法,那么我认为在这种情况下最合适的算法是 std::replace_if .例如

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
int main()
{
    std::string s("Hola Pepe, com va la vida");
    std::set<char> t({ 'a', 'e', 'i', 'o', 'u' });
    char c = '*';
    std::cout << s << std::endl;
    std::replace_if(s.begin(), s.end(),
        [&t](char c) { return t.count(c); }, c);
    std::cout << s << std::endl;
}

程序输出与上图相同

Hola Pepe, com va la vida
H*l* P*p*, c*m v* l* v*d*