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 :

probleme fonction strlen


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Par défaut probleme fonction strlen
    Salut à tous,j'ai trouvé sur un site une fonction strlen qui doit retourner la longueur d'une chaine de caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int strlen ( char* const str)
    {
             if (*str)
             return 1+strlen(str+1);
             else
             return 0;
    }
    mais je n'ai pas compris la troisième ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return 1+strlen(str+1);
    pourquoi pas :

    merci d'avence.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    C'est une implémentation récursive (et horrible, car non-terminale) de la fonction C standard strlen().
    Cette implémentation s'appelle à chaque fois récursivement sur une chaîne de plus en plus petite.

    Mais d'habitude, on l'implémente plutôt de manière itérative: Une simple boucle qui parcoure la chaîne de caractères jusqu'au caractère nul qui en marque la fin...
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    size_t strlen(char const * const str)
    {
    	size_t i = 0;
    	while(str[i] != '\0')
    		i++;
    	return i;
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par marbouchi Voir le message
    mais je n'ai pas compris la troisième ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return 1+strlen(str+1);
    pourquoi pas :

    La première remarque: suivre ce que dit Medinoc sur la récursivité!
    Pour répondre à ta question: str+1 permet de passer au caractère suivant. Donc return 1 + strlen(str+1) permet d'avancer d'un cran.
    Si tu fais return strlen(str), tu n'avances pas et tu fait une récursion infinie....

  4. #4
    Membre averti
    Inscrit en
    Décembre 2008
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 35
    Par défaut probleme fonction strlen
    c bon j'ai compris merci

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Et si je ne m'abuse elle est même intrinsic sur VisualC++

    Une version assembleur de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    inline size_t strlen(const char* str)
    {
       size_t ret = 0;
       while (!*str++) ++ret;
       return ret;
    }
    étant relativement simple

    En plus la fonction présentée est fausse, rien ne dit que la taille d'une chaine de caractères en mémoire tiendra sur un int...

    A noter, pour finir, que le nom "strlen" était correct en 1984, mais plus trop de nos jours puisqu'elle ne retourne pas le nombre de caractères, mais d'octets - 1.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par nicroman Voir le message
    A noter, pour finir, que le nom "strlen" était correct en 1984, mais plus trop de nos jours puisqu'elle ne retourne pas le nombre de caractères, mais d'octets - 1.
    Tout dépend de la définition de "longueur" et de "caractère".

    Personnellement, je considère "longueur" comme étant sans le \0 terminal, et "taille" comme étant avec. Et sur un blog, j'ai vu un article mettant l'accent sur la différence entre "caractère stocké" (storage character) et "caractère linguistique" (linguistic character).

    En tant que programmeur C, je n'utilise pratiquement jamais (et je reconnais que c'est parfois un tort) la notion de "caractère linguistique": toutes mes longueurs sont donc en "caractères stockés", car c'est ce dont la gestion de buffer a besoin. Par contre, dès qu'on touche à l'Unicode, il faut faire la différence entre "caractère stocké" et octet, car un "caractère stocké" en UTF-16/UCS-2 ou en UTF-32/UCS-4 fait plusieurs octets...

    En ajoutant un peu de notation hongroise "application" (Apps Hungarian), j'obtiens des noms de variables comme ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    char const * name = ...
    size_t cchNameLength = strlen(name);
    size_t cchNameSize = cchNameLength+1;
    size_t cbNameSize = cchNameSize * sizeof *name;
    char * name2 = malloc(cbNameSize);
    ...
    wchar_t const * name = ...
    size_t cchNameLength = strlen(name);
    size_t cchNameSize = cchNameLength+1;
    size_t cbNameSize = cchNameSize * sizeof *name;
    wchar_t * name2 = malloc(cbNameSize);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Probleme avec la fonction strlen
    Par lukil dans le forum C++
    Réponses: 6
    Dernier message: 02/02/2012, 10h24
  2. [Mail] Probleme fonction mail()
    Par tissot dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2005, 12h55
  3. problème fonctions callback
    Par youp_db dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 02/10/2005, 14h47
  4. probleme fonction gethostbyname
    Par oclone dans le forum Développement
    Réponses: 6
    Dernier message: 14/04/2005, 10h31
  5. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52

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