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 fonctions chaines de caractères.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Par défaut Problème fonctions chaines de caractères.
    Bonour voici l'exercice sur lequel je bloque :

    Le sous-programme « miroir » permet de concaténer à la phrase saisie au travers de l’option de l’exercice 1 son équivalent inversé avec un ‘ : ’ en séparateur. Voici un exemple : si la phrase saisie en 1 est « il fait beau », le résultat de cette option sera « il fait beau : uaeb tiaf li ».
    Ici, le sous-programme reçoit un pointeur sur une phrase et retourne le pointeur sur une nouvelle phrase allouée dynamiquement.
    L’appelant affiche la phrase résultat.

    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
    //ma fonction
    #include "mabib.h"
     
    char* inver(char* chaine)
    {
       int i;
       char sais[1000];
       char* tab2;
     
       for (i=0;i<=strlen(chaine);i++)
       {
          sais[i]=chaine[strlen(chaine)-i];
       }
       tab2=(char*)malloc((strlen(chaine))*sizeof(char));
       strcpy(tab2,sais);
       return(tab2);
    }
    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
    //mon main()
    #include "mabib.h"
     
    int main(int argc, char *argv[])
    {
       char* chaine1;
       int toto=0;
     
       printf("Affichez la phrase à mémoriser : ");
       chaine1=saisie(chaine1);
       puts(chaine1);
       voyelle(chaine1,&toto);
       printf("\n\n %d",toto);
       puts("");
       puts(inver(chaine1));
     
       system("PAUSE");	
       return 0;
    }
    Si quelqu'un pourrait m'expliquer mon erreure j'ai un peu de mal, je pense que ca vient surement de mon return(tab2) mais je vois pas comment faire autrement.

    Merci d'avance.

  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
    Tu devrais plutôt tenter d'inverser la chaîne "sur place" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Inverse(char *sz)
    {
    size_t const cch = strlen(sz);
    size_t i;
    for(i=0 ; i<cch/2 ; i++)
    	{
    	char const tmp = sz[i];
    	sz[i] = sz[cch-i-1];
    	sz[cch-i-1] = tmp;
    	}
    }
    Ainsi, pas de problème de buffer temporaire ou d'allocation.

    Sinon, quelques remarques:
    1. Pas de cast du retour de malloc() en C.
    2. Tu dois malloquer strlen()+1 et non strlen().
    3. Ton tableau statique ne sert à rien puisque tu connais déjà la longueur: Travaille directement sur la zone mémoire allouée.
    4. Utilise sizeof(*tab2) au lieu de sizeof(char).
    5. Je ne connais pas ta fonction de saisie, mais je suis sûr qu'elle a les mêmes problèmes que gets(). À bannir, utilise fgets() à la place.
    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
    Membre actif
    Inscrit en
    Novembre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 75
    Par défaut
    est ce que t'as pense à "return *tab32 ;" au lieu de "return tab32" tout court ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Par défaut re
    Pour la première réponse si je travail avec un void() je modifie la chaine1 de mon main() ce que je ne veux pas faire puisque l'exercice nous demande d'afficher la chaine1 entrée et celle inversée..
    sinon pour la 2 ème réponse oui j'ai essayé de retourner un *tab2 mais ceci fait planter mon programme..

  5. #5
    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 Hayron06
    Pour la première réponse si je travail avec un void() je modifie la chaine1 de mon main() ce que je ne veux pas faire puisque l'exercice nous demande d'afficher la chaine1 entrée et celle inversée..
    Et alors?
    Ma fonction est une brique de base...
    Tu peux toujours faire une fonction qui fait une copie de la chaîne passée en paramètre avant d'appeler la fonction d'inversion...
    Ce n'est pas optimal en termes de performances, je te l'accorde. Mais comme on dit...
    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.

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Ca ressemble à un problème d'effet de bord dans ta boucle. Pour le malloc, il faut allouer un octet en plus pour caratère de fin de chaine.

    Citation Envoyé par Hayron06
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [...]
    for (i=0;i<=strlen(chaine);i++)
    {
        sais[i]=chaine[strlen(chaine)-i];
    }
    tab2=(char*)malloc((strlen(chaine))*sizeof(char));
    [...]
    Essayes ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    [...]
        unsigned int len = strlen(chaine);
        for (i=0;i<len;i++)
        {
            sais[i]=chaine[len-i-1];
        }
        sais[i]='\0';
        tab2=malloc(strlen(chaine)+1);
    [...]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Par défaut ca marche!
    Crocodilex ta modification marche parfaitement pourrais tu m'expliquer mon erreur je ne la comprend pas... en particulier pourquoi arreter la boucle a strlen-1 et devoir rajouter manuelement sais[i]='\0'; je pensais que ca se faisait tout seul..

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Hayron06
    Crocodilex ta modification marche parfaitement pourrais tu m'expliquer mon erreur je ne la comprend pas... en particulier pourquoi arreter la boucle a strlen-1 et devoir rajouter manuelement sais[i]='\0'; je pensais que ca se faisait tout seul..
    Par quel miracle ?

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Par défaut
    Je me pose une question à laquelle j'arrive pas à répondre : le '\0' doit se trouver
    pour une chaine de caractère à la place tab[strlen(chaine)], or dans le programme écrit ci dessus le dernier i a pour valeur strlen(chaine)-1 pourquoi?

    exemple : ma chaine 'abcd'

    on a chaine[0]='a'
    chaine[1]='b'
    chaine[2]='c'
    chaine[3]='d'
    chaine[4]='\0' ( enfin je pense)

    on a strlen(chaine)=4;
    donc chaine[strlen(chaine)]='\0'
    et non chaine[strlen(chaine)-1] comme écrit dans le programme.
    pourtant ca fonctionne je suis dubitatif..

  10. #10
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Hayron06
    Je me pose une question à laquelle j'arrive pas à répondre : le '\0' doit se trouver
    pour une chaine de caractère à la place tab[strlen(chaine)], or dans le programme écrit ci dessus le dernier i a pour valeur strlen(chaine)-1 pourquoi?

    exemple : ma chaine 'abcd'

    on a chaine[0]='a'
    chaine[1]='b'
    chaine[2]='c'
    chaine[3]='d'
    chaine[4]='\0' ( enfin je pense)

    on a strlen(chaine)=4;
    donc chaine[strlen(chaine)]='\0'
    et non chaine[strlen(chaine)-1] comme écrit dans le programme.
    pourtant ca fonctionne je suis dubitatif..
    Je ne vois pas ce qu'il ya de compliqué la dedans.....

    Si chaine = "abcd", alors :
    chaine[0]='a'
    chaine[1]='b'
    chaine[2]='c'
    chaine[3]='d'
    chaine[4]='\0'

    Ce que tu veux c'est :
    sais[0]=chaine[3]='d'
    sais[1]=chaine[2]='c'
    sais[2]=chaine[1]='b'
    sais[3]=chaine[0]='a'
    sais[4]='\0'

    Si tu décomposes le code, tu obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        unsigned int len = strlen(chaine); /* len = 4   */
        for (i=0;i<len;i++)                /* i=0,1,2,3 */
        {
            sais[i]=chaine[len-i-1];       /* sais[0] = chaine[4-0-1] = 'd' */
                                           /* sais[1] = chaine[4-1-1] = 'c' */
                                           /* sais[2] = chaine[4-2-1] = 'b' */
                                           /* sais[3] = chaine[4-3-1] = 'a' */
        }                                  /* i=4 */
        sais[i]='\0';                      /* sais[4] = '\0' */
    Voilà, j'espère que c'est plus clair maintenant.

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

Discussions similaires

  1. Problème avec chaine de caractères
    Par Nicegame dans le forum C
    Réponses: 7
    Dernier message: 27/04/2007, 18h35
  2. Réponses: 1
    Dernier message: 30/03/2007, 16h38
  3. problème de chaine de caractère
    Par franco82 dans le forum C++
    Réponses: 10
    Dernier message: 01/12/2006, 20h32
  4. [MySQL] problème de chaine de caractère
    Par Leinad dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 18/10/2006, 14h52
  5. [FLASH 8] Problème de chaine de caractère
    Par dom_dev dans le forum Flash
    Réponses: 7
    Dernier message: 02/03/2006, 17h42

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