我问了类似的问题,但遗漏了一个重要的细节。我正在对字符数组(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/