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 :

Problème pointeurs C


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut Problème pointeurs C
    Bonjour à tous,

    Je débute en C, et je souhaiterai faire une fonction qui compte le nombre de mots compris dans une chaine de caractères.
    Voici mon 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
    int nbMots(char *chaine){
    	int n=0;
    	while(*(chaine++)){
    		while(*chaine==' '){
    			chaine++;
    		}
    		if(*(chaine)!=' '){
    			n++;
    			while(*(chaine)!=' '){
    				chaine++;
    			}
    		}
    	}
    	return n;
    }
    Que j'appelle grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *ch11=strdup("Bonjour comment ca va ?");
    printf("%d\n",nbMots(ch11));
    Malheureusement, et vous le devinez bien, c'est pour ça que je demande votre aide, cette fonction ne marche pas. Voici ce qu'on me dit pour la valeur de chaine :
    CXX0030 : erreur : impossible d'évaluer l'expression

    Je ne sais pas du tout comment m'en sortir, toute aide est la bienvenue. Je suis sous Visual Studio 2010.
    Je vous remercie.

  2. #2
    Membre Expert
    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
    Par défaut
    Salut

    Précise quelle est la ligne concernée par l'erreur. S'il s'agit de strdup, c'est normal : ce n'est pas une fonction standard. Toutefois, tu as un exemple d'implémentation ici : http://www.developpez.net/forums/d44...dup-ca-marche/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Merci pour ta réponse.

    La fonction strdup fonctionne très bien. Le programme se compile bien, l'erreur se produit à l'exécution.
    L'erreur cible les lignes 7 et 9, apparemment une erreur avec mon pointeur 'chaine', mais je ne vois absolument pas laquelle.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Par défaut
    pk utiliser strdup d'ailleurs?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Oui strdup est ici inutile. Je l'avais ajouté un peu par réflexe, au cas où je voudrais mofifier la chaine par la suite. Mais j'ai tenté la fonction sans le strdup, j'obtiens la même erreur...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Par défaut
    j'ai pas vérifié l'exactitude de ta fonction (d'ailleurs, tu risque de prendre les signe de ponctuation pour des mots avec cette fonction), mais par contre le
    chaine++; c'est pas plutot *chaine++ pour faire avancer le pointeur sur la chaine?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    J'ai modifié la place de mes parenthèses dans les tests par ((*chaine)!=' ') mais ca ne change rien.
    Et si je fais (*chaine)++ ça ne va pas déplacer mon pointeur, mais modifier le contenu de mes chaînes.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Par défaut
    en fait ca segfault ... tu devrais prendre l'habitude d'utiliser les débuggeurs pour suivre l'execution ligne par ligne et voir ou l'erreur est lancé, avec quelle valeur dans les variables etc...

    while(*(chaine)!=' '){

    tu vérifie que c pas un espace, mais tu vérifie pas que c'est pas non plus la fin de ta chaine ('\0' en fait) alors que si tu suis l'execution de ta fonction tu incrémente le pointeur juste avant (la fonction while un peu avant) mais tu n'a pas de vérification après sur s'il reste qqchose à lire dans la chaine ou pas (meme si tu le fais sur le premier while, par lequel on repasse pas forcément au vu de ton code et qu'on a une incrémentation de pointeur qui intervient avant de revenir à cette instruction de test).

    à remplacer donc par :
    while(*chaine && *chaine != ' ')

    et comme je disais dans mon post précedent, tu dois remplacer chaine++ que t'a après tes while par *chaine++ sinon c pas le pointeur que tu incrémente...

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    [hh@bsd ~]$ cat test.c
    #include <stdio.h>
     
    int nbMots(char *chaine){
            int n=0;
            while(*(chaine++))
             {
              while(*chaine == ' ')
                            *chaine++;
                    if(*chaine != ' ')
                            n++;
                    while(*chaine && *chaine != ' ')
                            *chaine++;
     
            }
            return n;
    }
     
    int main()
    {
      int  n = 0;
      char *str = "     chaine à évaluer\0";
     
      n = nbMots(str);
      printf("la chaine (%s) contient %d mots\n", str, n);
    }
     
    [hh@bsd ~]$ cc test.c -o test
    [hh@bsd ~]$ ./test
    la chaine (     chaine à évaluer) contient 3 mots
    [hh@bsd ~]$

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 8
    Par défaut
    Merci beaucoup pour ton aide, le code marche très bien. Il faut que je révise un peu mon cours sur les pointeurs

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    44
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 44
    Par défaut
    C'était aussi un problème d'algo ... si tu regardes bien, ton premier while vérifie qu'il reste qqchose dans la chaine à traiter.
    Dans cette meme boucle , tu as par contre deux autres while qui eux ne vérifie pas cette condition, sauf que pour le 1er de ces while, la boucle principale le fait, mais pour le 2eme, s'il y'a eu execution de la boucle d'avant il y'a incrémentation du pointeur sans que tu vérifie encore. en fait dans la chaine "pour tester" une fois arrivé au r de tester, c la fin de la chaine, tu compare à si c'est un espace, et bien sur c pas un espace mais \0 qui est rencontré et donc la condition est valide et tu executes quand meme des instructions et une avancée de pointeur qui fait que tu dépasse ta chaine ...

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

Discussions similaires

  1. Problème: pointeur de fonction à partir d'un namespace
    Par akileaQuébec dans le forum C++
    Réponses: 8
    Dernier message: 09/10/2007, 10h37
  2. Problème Pointeurs d'objets
    Par Julien_C++ dans le forum C++/CLI
    Réponses: 6
    Dernier message: 03/08/2007, 16h00
  3. Problème pointeur de fonction
    Par ired dans le forum C++Builder
    Réponses: 7
    Dernier message: 16/06/2007, 13h24
  4. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

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