IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

fonction strlen calcule de la longueur de chaine


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut fonction strlen calcule de la longueur de chaine
    Bonjour

    Voila sur le tuto des chaines de caractères il y a cette fonction pour calculer la longueur d'une chaine..

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    int longueurChaine(const char* chaine)
    {
        int nombreDeCaracteres = 0;
        char caractereActuel = 0;
     
        do
        {
            caractereActuel = chaine[nombreDeCaracteres];
            nombreDeCaracteres++;
        }
        while(caractereActuel != '\0');
     
        nombreDeCaracteres--; 
     
        return nombreDeCaracteres;
    }
    Donc je voulais modifier ce code pour utiliser une boucle for mais cela fonctionne pas.. ou se trouve le problème?)

    Voici le code modifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int longueurChaine(const char* chaine)
    {
        int i;
        char caractereActuel = 0;
     
       for ( i = 0; caractereActuel != '\0'; i++)
    {
         caractereActuel = chaine[i];
    }
         return i--;
     
    }

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    mais cela fonctionne pas.. ou se trouve le problème?
    C'est normal : tu initialises caractereActuel à 0. Donc, dès l'entrée dans la boucle, caractereActuel != '\0' renvoie 0 et provoque la sortie de la boucle.

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par lassault1 Voir le message
    Donc je voulais modifier ce code pour utiliser une boucle for mais cela fonctionne pas.. ou se trouve le problème?)
    Dans une boucle for, la condition de sortie est testée avant de rentrer dans le corps de la boucle.

    Dans le code tu as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char caractereActuel = 0;
     
    for ( i = 0; caractereActuel != '\0'; i++)
    Donc caractereActuel != '\0' est faux dès l'entrée (puisque '\0' est égal à 0) dans le for et tu sors immédiatement de la boucle.

    En outre i-- est un post-décrémentation, ainsi la fonction retourne la valeur de i avant la décrémentation.

    Au passage, si tu es intéressé sur la manière de recoder les fonctions de manipulation de chaînes, je t'invite à lire l'article Etude détaillée du module String de la libc.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Merci a vous..

    Et comment corrigé ce code?

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Citation Envoyé par lassault1 Voir le message
    Merci a vous..

    Et comment corrigé ce code?
    Il faut initialiser la variable à une autre valeur. Au niveau du return, il faut aussi préfixer et non postfixer l'opérateur --.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    merci..

    Pourquoi la variable caractereActuel n'est pas un tableau, car normalement il faut un tableau pour copier un tableau..
    Exemple : caractereActuel[i] = chaine[i]; et non caractereActuel = chaine[i];

  7. #7
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Parce que chaine[i] est un char. Comme caractereActuel est également un char, je ne vois pas pourquoi on ne pourrait pas faire l'affectation : caractereActuel = chaine[i]. De plus, on a juste besoin de stocker (temporairement) un caractère dans caractereActuel. char est donc le type qui convient le mieux, nul besoin d'un tableau.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Merci a tous c'est ok! tout rentre dans l'ordre...

    Une autre question :

    Le i++ dans for(i = 0; i < taille; i++) s'incrémente si la condition est vrai ou elle s'incrémente après les instructions (c'est a dire a la fin de la boucle) ?

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Cette question ne devrait pas se poser ici, puisque c'est traité dans n'importe quel cours de C, mais bref. i++ est exécuté à la fin de chaque itération. Pour rappel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i = 0; i < taille; i++)
    {
        /* ... */
    }
    Est strictement équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    i = 0;
    while (i < taille)
    {
        /* ... */
        i++;
    }
    Il y a une exception à cette affirmation, mais tu peux parfaitement l'ignorer. Si tu t'intéresse à cette exception, je t'invite à lire ceci.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 103
    Points : 44
    Points
    44
    Par défaut
    Merci pour ce rappel car je l'avais oublié

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SDL_TTF] ajuster les polices en fonction de la place et longueur de chaine
    Par luckyalan dans le forum SDL
    Réponses: 4
    Dernier message: 26/02/2014, 09h41
  2. calcul longueur de chaine
    Par nico72 dans le forum jQuery
    Réponses: 4
    Dernier message: 25/06/2009, 12h48
  3. [Tableaux] Fonction et longueur de chaine
    Par crischprolch dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2007, 10h46
  4. Réponses: 6
    Dernier message: 06/10/2005, 16h02
  5. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo