我正在迭代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)说了同样的话。
答案 0 :(得分:3)
将if
放在switch
之外。
虽然我没有任何反对使用continue
和break
的内容,但是这次你可以在没有很多代码的情况下绕过它们:只需恢复条件并放入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
}
}