2017-04-21 42 views
1

我想提高我在c中的技能,當涉及到了解計算字符串中字母出現的不同方法時,我有點困惑函數,對於如何改進代碼或者計算函數字符串中出現字母的次數的新方法,能夠獲得不同的意見。CountChars數組字符串循環函數字母出現

有什麼建議嗎?

#include <stdio.h> 

int countingCharacters(char *message, int size, char charToBeCounted); 


int main() { 

    char arrMess[13] = { "hejsanSvejsan" }; 
    char charsToBeCounted = 'a'; 

    for (int i = 'a'; i <= 'z'; i++) { 

     printf("%c, %d:\n", charsToBeCounted, countingCharacters(arrMess, 13, charsToBeCounted)); 
     charsToBeCounted++; 

    } 
    getchar(); 
    return 0; 
} 

int countingCharacters(char *message, int size, char charToBeCounted) { 

    int counter = 0; 
    int i = 0; 

    while (i < size) 
    { 
     if (message[i] == charToBeCounted) 
      counter++; 
     i++; 
    } 
    return counter; 
} 
+2

也許[代碼審查](https://codereview.stackexchange.com/)將是正確的地方問這個問題。 –

+0

'charsToBeCounted'是不必要的,我認爲它會更清晰和更快,儘管可以忽略這麼簡單地使'i'變成字符。除了不留出空餘空間來容納終結者之外,硬編碼的大小將使代碼難以改變。我猜這個問題主要是問,有沒有更快的方法來計算字符發生的次數,不幸的是,在複雜性方面,沒有。 'int i ='a';我<='z';'是好的,但是很迂腐,我不認爲'a'到'z'的十進制值必須是按順序連續的,唯一真正的解決方案是使用一個數組或者圖書館。 – George

回答

0

您可以省略size並檢查字符串末尾的'\ 0'。

int countingCharacters(char *message, char charToBeCounted) { 
    int counter = 0; 
    while (message != '\0') 
    { 
     if (*message == charToBeCounted) 
      counter++; 
     message++; 
    } 
    return counter; 
} 
1

如果您的代碼計數字符串中的每一個字母(A至Z),你可以做一個合格和使用數組來跟蹤有多少每個。沿着線的東西:

void countingCharacters(char *message, unsigned int count[]) { 
    while(*message) { 
     if(isalpha(*message)) { 
      count[tolower(*message)-'a']++; 
     } 
     message++; 
    } 
} 

int main() { 

    char arrMess[] = { "hejsanSvejsan" }; 
    char i; 
    unsigned int count[26] = { 0 }; 

    countingCharacters(arrMess,count); 
    for(i='a';i<='z';i++) { 
     printf("%c, %d:\n", i, count[i-'a']); 
    } 
    return 0; 
} 

我刪除的arrMess大小的硬編碼的方式,因爲這是錯誤的。您的字符串長度爲13個字符,如果您需要額外存儲'\0',則該字符串太大而無法放入13號字符數組。