如果前一个字符相同,则跳过数组中的字符

时间:2012-08-28 19:37:45

标签: c++ switch-statement cstring

我正在迭代chars数组来进行一些操作。如果有两个相邻的字符相同,我想“跳过”迭代。

e.g。 x112abbca
跳过---------- ^

我有一些代码,但它不优雅,并想知道是否有人能想到更好的方法?我在case语句中有一些switch,如果我不必在if内使用switch语句,我会很高兴。

switch(ent->d_name[i])
{
            if(i > 0 && ent->d_name[i] == ent->d_name[i-1])
                continue;
            case ' ' :
            ...//code omited
            case '-' :
            ...
}

顺便说一句,一位导师曾告诉我“避免continue s,除非需要更多代码来替换它们”。有谁先说了吗? (实际上他对break s)说了同样的话。

4 个答案:

答案 0 :(得分:3)

if放在switch之外。

虽然我没有任何反对使用continuebreak的内容,但是这次你可以在没有很多代码的情况下绕过它们:只需恢复条件并放入if-block中的整个switch语句。

回答纠正的问题:什么是干净的取决于很多因素。这个字符列表要考虑多长时间:你应该自己迭代它们,还是使用<algorithm>中的效用函数?无论如何,如果你多次提到同一个角色,也许你应该给它一个别名:

std::string interesting_chars("-_;,.abc");

// ...
for (i...) {
  char cur = abc->def[i];
  if (cur != prev || interesting_chars.find(cur) == std::string::npos)
      switch (current) // ...

答案 1 :(得分:0)

char chr = '\0';
char *cur = &ent->d_name[0];
while (*cur != '\0') {
    if (chr != *cur) {
        switch(...) {
        }
    }
    chr = *cur++;
}

答案 2 :(得分:0)

如果您可以破坏正在分析的阵列的内容,可以使用std::unique()对其进行预处理:

ent->erase(std::unique(ent->d_name.begin(), ent->d_name.end()), ent.end());

这应该用一个副本替换所有相同字符序列并适当缩短字符串。如果你不能破坏字符串本身,你可以创建一个只包含一个字符串的字符序列的副本:

std::string tmp;
std::unique_copy(ent->d_name.begin(), ent->d_name.end(), std::back_inserter(tmp));

如果您使用的是C字符串:请改用std::string。如果你坚持使用C字符串并且不想使用std::unique()比你更好的方法是使用previous字符,则初始化为0(这不是毕竟是C字符串的一部分:

char previous(0);
for (size_t i(0); ent->d_name[i]; ++i) {
    if (ent->d_name[i] != previous) {
        switch (previous = ent->d_name[i]) {
             ...
        }
     }
}

答案 3 :(得分:0)

我希望我明白你要做什么,无论如何,这会找到匹配的对并跳过一场比赛。

char c_anotherValue[] = "Hello World!";

int i_len = strlen(c_anotherValue);
for(int i = 0; i < i_len-1;i++)
{
    if(c_anotherValue[i] == c_anotherValue[i+1])
    {
        printf("%c%c",c_anotherValue[i],c_anotherValue[i+1]);
        i++;//this will force the loop to skip
    }
}