c++ - 如果某个字符与数组中的前一个字符相同,则跳过该字符

标签 c++ algorithm language-agnostic cstring

我问了类似的问题,但遗漏了一个重要的细节。我正在对字符数组(cstring)进行一些文本处理。输入数组将复制到输出数组,但某些字符会发生更改(例如 a->b)。这是通过使用 switch 语句来完成的。我想要的是,如果在一行中找到两个或多个特定字符,则只有其中一个字符被复制到新数组中(所以我不希望一行中有两个空格)。

这是我到目前为止所得到的,它可以在不跳过连续某些字符中的两个或多个字符的情况下工作:

char cleanName[ent->d_namlen];
    for(int i = 0; i < ent->d_namlen; i++)
    {
        switch(ent->d_name[i])
        {

            case 'a' :
                cleanName[i] = 'b';//replace a's with b's (just an example)
                break;
            case ' ' ://fall through
            case '-' :
            case '–' :
            case '—' :
                cleanName[i] = '_';//replace spaces and dashes with spaces
                break;
            ....//more case statments
           default: 
                cleanName[i] = ent->d_name[i];
  }
}

例如,如果一行中的两个字符被下划线替换,我该怎么做?我是否只执行 switch 语句 if(ent->d_name[i] != previous || (ent->d_name[i] != '-' && ent->d_name[ i] != '_' && ent->d_name[i] != ' ')

这可能更多是一个算法问题,而不是特定于实现的问题。

输入示例:abbc--d-e
输出:bbbc_d_e (为简单起见,假设“a”映射到“b”,但实际上不止这些)

最佳答案

最简单的方法是使用std::unique在现有转换之后,使用自定义谓词:

cleanName.erase(std::unique(std::begin(cleanName), std::end(cleanName),
    [](char c, char d) { return c == '_' && d == '_'; }), std::end(cleanName));

对于 char 数组:

length = std::unique(cleanName, &cleanName[length],
    [](char c, char d) { return c == '_' && d == '_'; }) - cleanName;
cleanName[length] = '\0';

关于c++ - 如果某个字符与数组中的前一个字符相同,则跳过该字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12221680/

相关文章:

java - 将日期打包到一个 int 变量中 (Java)

algorithm - 查找作为其他字符串前缀的字符串

c++ - 最大化精度的操作顺序

c++ - 多线程 std::shared_ptr 读/写

algorithm - 逆波兰表示法中的变长运算符(后缀)

language-agnostic - 网站开发最佳实践,首先是设计还是编码?

language-agnostic - 两条线段之间的最短距离

c++ - 我想学习游戏开发。我应该使用哪种语言?

c++ - Qt 4.7 在 Windows 上使用 Eclipse?

javascript - 如果索引不存在,则获取对象中的数据