gpt4 book ai didi

c++ - 跳过一个字符,如果它是某个字符并且数组中的前一个字符相同

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:40 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com