1

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

例如 x112abbca
跳过----------^

我有一些代码,但它并不优雅,想知道是否有人能想到更好的方法?我在声明中有几个case',switch如果我不必ifswitch.

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

顺便说一句,一位讲师曾经告诉我“避免使用continues,除非需要大量代码来替换它们”。有人支持吗?(其实他对breaks也是这么说的)

4

4 回答 4

3

if外面的switch

虽然我没有反对使用continueand break,但这次你当然可以绕过它们而无需太多代码:只需恢复条件并将整个 switch 语句放在 if 块中。

回答已纠正的问题:什么是干净的取决于许多因素。这个字符列表需要考虑多长时间:您应该自己迭代它们,还是使用来自 的实用函数<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) // ...
于 2012-08-28T19:38:53.863 回答
0
char chr = '\0';
char *cur = &ent->d_name[0];
while (*cur != '\0') {
    if (chr != *cur) {
        switch(...) {
        }
    }
    chr = *cur++;
}
于 2012-08-28T19:59:54.433 回答
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]) {
             ...
        }
     }
}
于 2012-08-28T20:03:25.750 回答
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
    }
}
于 2012-08-28T23:58:25.163 回答