2012-08-28 69 views
1

我正在遍歷chars的數組以進行一些操作。如果兩個相鄰的字符相同,我想「跳過」迭代。如果前面的字符相同,則跳過數組中的字符

例如x112abbca
skip ----------^

我有一些代碼,但它不是優雅的,想知道是否有人可以想到更好的方法?我在switch聲明中有幾個case,如果我不需要在switch中使用if聲明,我會很高興。

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

順便說一句,一個教練曾經告訴我:「除非迴避很多代碼是需要更換它們continue的」。有沒有其他人呢? (實際上他說的相同break s)

+0

'繼續'在這裏就好了,國際海事組織。你的教練建議使用什麼呢?還要注意你正在比較'ent-> d_name [i-1]'到自己。 – jrok

+1

結構編程狂熱分子不喜歡'continue'和'break'類似的原因,他們憎恨'goto':它們將他們認爲不必要的複雜性引入到控制流程中。和大多數編程思想一樣,這種觀點也有一些道理,但這些構造也可以簡化代碼並使其更易於閱讀。以個案爲基礎,就像其他所有事情一樣。 – mwigdahl

+0

在某些(如果不是很多的話)實例(恕我直言)中,'斷點'是不可避免的,尤其是在'switch'語句中。 – ChiefTwoPencils

回答

3

if放在switch之外。

雖然我沒有反對使用continuebreak任何東西,你當然可以繞過它們這次沒有代碼在所有的:簡單地恢復狀態,並把if區塊內的整個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) // ... 
+0

@Celeritas,我不知道你編輯的內​​容。當然,我不知道你認爲原始代碼可以做什麼,但是把'if'放在一個像這樣的開關裏面是沒用的:它是無效代碼。 –

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

我沒有得到關於C++的東西,似乎許多函數和對象使用cstrings而不是字符串。根據[docs](http://pubs.opengroup.org/onlinepubs/7908799/xsh/dirent.h.html)'d_name'是一個字符數組,所以我不知道'.begin'和'.end()'會工作嗎? – Celeritas

+0

如果'd_name'是一個數組,則不會有'begin()'和'end()'成員。不過,你可以,例如使用'ent-> d_name + strlen(ent-> d_name)'得到一個結束迭代器。你也不能在數組中使用'erase()',所以你可以捕獲結束,例如'char const * end = std :: unique(ent-> d_name,ent-> d_name + strlen(ent- > d_name));'。 –

+0

所以我想我會試試你最後一個例子。你確定for循環工作正常嗎? 'ent-> d_name [i]'如何成爲條件? – Celeritas

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 
    } 
} 
相關問題