2017-04-21 44 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号字符数组。