2017-09-06 3 views
-1

La boucle for ci-dessous continue jusqu'à la fin de la chaîne, tandis que la branche if vérifie combien de fois le caractère 'u' apparaît dans la chaîne, "yuzuf Oztuk", qui est 3 fois. Pendant ce temps, le nombre de variables compte le nombre de u dans la chaîne. Quand je compile le code, j'obtiens 15 pour le nombre de fois que vous apparaissez dans la chaîne, ce qui est faux.Comptage du nombre de fois qu'un caractère apparaît dans une chaîne dans la programmation c?

int numTimesAppears(char* mystring, char ch) 
{ 
    int i; 
    int count; 
    for(i = 0; mystring[i] != '\0' ; ++i) 
    { 
     if (mystring[i] == ch) 
     { 
      count++; 
     } 
    } 
    return count; 
} 
+7

'int count;' -> 'int count = 0;' – BLUEPIXY

+0

Merci, je viens compilé et il m'a donné la bonne réponse. – user24741

+2

l'utilisation d'une variable non initialisée est un comportement indéfini – yano

Répondre

1

Je reçois 15 pour le nombre de fois u apparaît dans la chaîne, ce qui est faux.

  1. Question clé: Code doit initialiser la valeur de count. @BLUEPIXY

    // int count; 
    int count = 0; 
    
  2. cas d'angle: Comme le caractère nul est dans la chaîne, un résultat de 1 « pour le nombre de fois qu'un personnage apparaît dans une chaîne » serait prévu pour tout numTimesAppears(some_string, '\0'). Une boucle do corrige cela. Une fonction de bibliothèque standard similaire est strchr(), qui recherche la première correspondance et considère le caractère nul partie de la chaîne de recherche string: "... caractère nul de fin est considéré comme faisant partie de la chaîne." Comme pour tous les cas d'angle, divers résultats pourraient être déduits - mieux documenter l'objectif de codage dans ce cas.

    i = 0; 
    do { 
        if (mystring[i] == ch) { 
        count++; 
        } 
    } while (mystring[i++]); 
    
  3. Comme la fonction ne modifie pas la chaîne inspecté, ce qui en fait const augmente l'applicabilité et peut-être la performance de la fonction. @Vlad from Moscow

  4. L'indexation de tableau utilise au mieux size_t plutôt que int. int peut être trop étroit.

    size_t numTimesAppears(const char* mystring, char ch) { 
        size_t count = 0; 
        size_t i = 0; 
        do { 
        if (mystring[i] == ch) { 
         count++; 
        } 
        } while (mystring[i++]); 
        return count; 
    } 
    
+1

2 est faux. Une chaîne ne "contient" pas le caractère NUL. Le fait qu'un NUL soit utilisé pour implémenter une chaîne C ne signifie pas qu'il contient le NUL. Si cela aide à penser à cela, le nombre de caractères contenus par une chaîne est donné par 'strlen()', et 'strlen()' n'inclut pas le NUL dans son compte. 'numTimesAppears (anyString, '\ 0')' devrait toujours retourner '0'. –

+0

@KevinBallard Concernant ["Une chaîne ne contient pas" le "caractère NUL"] (https://stackoverflow.com/questions/46085187/counting-the-number-of-times-a-character-appears-in-a -string-in-c-programming/46085480? noredirect = 1 # comment79133256_46085480), la spécification C définit _string_ comme "A _string_ est une séquence contiguë de caractères terminée par et ** incluant le premier caractère nul **." Peut-être que la spécification C est fausse? Un certain nombre de fonctions lib standard ne comptent pas explicitement le caractère _null, et d'autres le font explicitement. IAC, je pense que nous sommes d'accord que la fonction devrait être documentée par ce cas. – chux

+0

4. est un peu risqué. Sa largeur est définie par l'implémentation (6.5.3.4), et il n'est pas recommandé d'avoir un rang de conversion supérieur à * signed long int * (7.1.9) et est seulement garanti être plus grand que '65535' (7.20.3) - bien que tout compilateur que j'ai vu au moins fournisse une plage sur les valeurs positives de 'int', et Gnu fournit une plage sur les valeurs positives de' long int'. Il s'agit donc d'un autre petit peu de soupe définie par l'implémentation. –