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 :

Inversion d'une chaine


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Inversion d'une chaine
    Bonjour
    J'ai essayé ce matin d'écrire une fonction qui inverse une chaine de caractères en utilisant une pile (LIFO). 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
    17
    18
    19
    20
    21
    22
    23
     
    void inverser(char **s)
    {
        Pile *p;
        char *aux;
        int i;
     
        pile_vide(&p); 
        aux = *s;
        while(*aux)
        {
            empiler(&p, *aux);
            aux++;
        }
     
        i = 0;
        while(!est_vide(p))
        {
            * (*s + i) = depiler(&p);
            i++;
        }
        * (*s + i) = '\0';
    }
    Mon code compile mais il génère une erreur de segmentation. Après quelques tentatives de déboguage "manuel" (des printf partout ) j'ai pu déduire que l'erreur vient de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    * (*s + i) = depiler(&p);
    mais je ne vois pas ce que j'ai fait de mal (bon disons que le langage C et moi, ça fait 2)

    (je peut vous donner le code des fonctions de manipulation de la pile si vous voulez, mais je suis sur à 99% que l'erreur ne vient pas de là).

    Cordialement, Gotoma.

  2. #2
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Salut,

    Pourrais tu poster le code complet ?

    Déclaration du type PILE par exemple, des fonctions que tu utilises.


    Merci

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ce qui est étonnant, c'est le prototype de la fonction inverser(), et on se demande quel est la séquence d'appel que tu utilises.
    Avoir un paramètre en char** signifie que l'argument de la fonction au moment de l'appel est un tableau de pointeurs sur char, pas un tableau de char, ni l'adresse d'un tableau de char.
    En conséquence, lorsque tu écris * (*s + i), comme *s est du type pointeur sur char, *s+i va incrémenter l'adresse non pas d'un byte, mais de sizeof(char*) bytes (typiquement 4 bytes)

    Normalement, si tu veux inverser une chaine de caractères, il suffit de passer l'adresse de départ de la chaine, ce qui donne (sauf erreur, je n'ai pas testé parce que je n'ai pas envie d'écrire les fonctions gérant la pile) :
    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
    void inverser(char *s)
    {
        Pile *p;
        char *aux;
        int i;
     
        pile_vide(&p); 
        aux = s;
        while(*aux)
        {
            empiler(&p, *aux);
            aux++;
        }
        i = 0;
        while(!est_vide(p))
        {
            * (s + i) = depiler(&p); // ou s[i] = depiler(&p);
            i++;
        }
        * (s + i) = '\0'; // ou s[i] = '\0';
    }
    ....
    char tab[]= "123456";
    inverser(tab);
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Juin 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Tunisie

    Informations forums :
    Inscription : Juin 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Merci diogene, j'ai compris l'erreur que j'ai commise.
    En fait, j'ai mis un char** car je me suis dit "une chaine est un char* et puisqu'elle sera modifiée par la fonction donc il faut que je lui passe un pointeur sur chaine" et je n'ai pas fait attention que la chaine est en fait un pointeur dont je ne suis pas obligé de modifier la valeur.

    Merci encore une fois

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

Discussions similaires

  1. [C#] Comment inverser une chaine de caractères ?
    Par just1980 dans le forum Contribuez
    Réponses: 6
    Dernier message: 01/05/2011, 20h35
  2. [WD11] Inverser une chaine de caractère
    Par Redg9 dans le forum WinDev
    Réponses: 4
    Dernier message: 31/03/2010, 20h29
  3. recursivité :inverser une chaine de caractères
    Par Echap dans le forum Débuter
    Réponses: 20
    Dernier message: 14/05/2009, 19h43
  4. Inverser une chaîne de caractères
    Par yiuyiu dans le forum MATLAB
    Réponses: 4
    Dernier message: 09/08/2007, 10h13
  5. Réponses: 10
    Dernier message: 28/02/2007, 00h00

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