2017-04-21 3 views
1

J'essaie d'avancer mes compétences dans c, je suis un peu confus quand il s'agit de comprendre les différentes façons de calculer l'occurrence des lettres dans une chaîne avec fonction, serait être génial de recevoir différents points de vue sur la façon dont je pourrais améliorer le code ou une nouvelle façon de compter combien de fois une lettre se produit dans une chaîne avec une fonction.CountChars tableau chaîne boucle fonction lettre occurrence

Un conseil?

#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

Peut-être [Code Review] (https://codereview.stackexchange.com/) serait le bon endroit pour poser cette question. –

+0

'charsToBeCounted' est inutile, je pense que ce serait plus clair et plus rapide, quoique négligeable, pour simplement faire un caractère. En plus de ne pas laisser de place à un terminateur nul, le codage dur de la taille rendra le code plus difficile à changer. Je suppose que la question est surtout de savoir s'il existe un moyen plus rapide de compter le nombre de fois qu'un char se produit, malheureusement en termes de complexité, il n'y en a pas. 'int i = 'a'; je <= 'z'; 'est bon, mais pour être pédant, je ne pense pas que les valeurs décimales de 'a' à 'z' soient en ordre et contiguës, la seule vraie solution est d'utiliser un tableau ou bibliothèque. – George

Répondre

0

Vous pouvez size et vérifier omis pour « \ 0 » à la fin de la chaîne.

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

Si votre code compte chaque lettre (a à z) dans la chaîne, vous pouvez le faire une passe et utiliser un tableau pour suivre combien il y a de chacun. Quelque chose le long des lignes de:

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; 
} 

J'ai enlevé le codage en dur de la taille de arrMess, en passant, parce qu'il avait tort. Votre chaîne comportait 13 caractères, ce qui serait trop volumineux pour entrer dans un tableau de caractères de taille 13, car vous avez besoin de 1 supplémentaire pour stocker le '\0' à la fin.