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 :

Prob pour inverser des caractères


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Prob pour inverser des caractères
    Bonjour, le but de mon exercice est d'inverser une chaine de caractères. j'ai donc réfléchi et j'ai trouver le morceau de programme ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       int e=0;
       int longeurMot2;
       longeurMot2=longueur(T2);//enregistre la taille de T2
       for(e=0;T2[e]!='\0';e++)
       {
     
            T4[e]=T2[longeurMot2-1-e];
       }

    L'inversion se fait donc correctement mais des caractères parasites viennent se placer à la fin de la chaine inversée.
    Merci d'avance pour votre aide

  2. #2
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut Re: pourquoi ca marche pas?
    Citation Envoyé par benito62
    L'inversion se fait donc correctement mais des caractères parasites viennent se placer à la fin de la chaine inversée.
    J'ai lu ton code et j'arrive pas à determiner l'erreur, je me demande sur la nature des caractères parasites qui se placent à la fin de la chaine!!!
    Pouvez vous me donner un exemple d'éxécution.
    Merci

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Est-ce que ta chaine inversée contient le caractère de fin de chaine: \0 :

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Inversion de Chaine
    Voila ce que donne l'execution de ces quelques lignes de commandes


    [T4=ruojnob~ `õ▲÷ ].

  5. #5
    Membre habitué Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Points : 162
    Points
    162
    Par défaut je pense que le probléme est...
    Je pense que le probléme et dans la fonction longueur(....), càd, je pense que la fonction longueur fournit une dimension du tableau plus grande que la vrai dimension. Alors le programme affiche des caractères parasites qui ne se trouvent pas dans le tableau mais dans la mémoire... Je pense que cela peut être la seule raison.
    Question :
    - Quelle est la déclaration de la fonction longueur(...)?
    Merci

  6. #6
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    Citation Envoyé par CSoldier
    Est-ce que ta chaine inversée contient le caractère de fin de chaine: \0 :
    Avec le code que l'on a non!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int e=0;
    int longeurMot2;
    longeurMot2=longueur(T2);//enregistre la taille de T2
    for(e=0;T2[e]!='\0';e++)
    {
     
    T4[e]=T2[longeurMot2-1-e];
    }
    T4[e] = '\0';
    Revoir la définition d'une chaîne de caractère en C : Les chaînes de caractères en C

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    J'ai fait une fonction dont le role etait le meme y'a quelques jours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       for (i = strlen (source) - 1; i > 0; i--)
       {
          memmove (&but[j], &source[i], 1);
          j++;
       }
       but[j++] = source[0];
       but[j] = '\0';

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut declaration de la fonction longueur()
    la fonction longueur est défini comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int longueur(char T[])
    {
        int a=0;
         while(T[a]!='\0')
         {
           a++;
         }
       return(a);
    }

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut Re: declaration de la fonction longueur()
    Citation Envoyé par benito62
    la fonction longueur est défini comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     int longueur(char T[])
    {
        int a=0;
         while(T[a]!='\0')
         {
           a++;
         }
       return(a);
    }
    Tu sais que y'a strlen ?

  10. #10
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut Re: declaration de la fonction longueur()
    Citation Envoyé par CSoldier
    Citation Envoyé par benito62
    la fonction longueur est défini comme suit :

    [ int longueur(char T[])
    {
    int a=0;
    while(T[a]!='\0')
    {
    a++;
    }
    return(a);
    }]
    Tu sais que y'a strlen ?
    Et les balises code aussi? Une dernière chose, pense à faire des titres clairs car par définition lorsque les gens postent sur ce forum c'est que "ça ne marche pas"

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut librairie strlen
    Bien sur que je connais cette fonction mais justement dans ce programme on ne peut pas utiliser la bibliothèque string.h.

    Je vais essayer de mettre le dernier caractère à '\0'. Merci pour ces renseignements.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: pourquoi ca marche pas?
    Citation Envoyé par ccensam
    J'ai lu ton code et j'arrive pas à determiner l'erreur, je me demande sur la nature des caractères parasites qui se placent à la fin de la chaine!!!
    Pouvez vous me donner un exemple d'éxécution.
    Il ne faut être grand clerc pour supposer une erreur genre 0 de fin qui manque...

    EDIT: Version corrigée et sécurisée.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    #include <stdio.h>
     
    size_t longueur(char T[])
    {
        size_t i = 0;
     
        while(T[i] != 0)
        {
            i++;
        }
        return i;
    }
     
    int invert(char const *T2, char *T4, size_t size)
    {
        int err=0;
        size_t i = 0;
        size_t len = longueur(T2);
     
        if (len < size - 1)
        {
            for(i = 0; T2[i] != 0; i++)
            {
                T4[i] = T2[len - 1 - i];
            }
            /* -ed- ajoute */
            T4[i] = 0;
        }
        else
        {
            err=1;
        }
        return err;
    }
     
    int main (void)
    {
        char const sin[] = "hello world";
        char sout[]="???????????????????????????????";
     
        int err = invert (sin, sout, sizeof sout);
     
        if (!err)
        {
            printf("%s\n", sin);
            printf("%s\n", sout);
        }
     
        return 0;
    }
    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    hello world
    dlrow olleh

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Juste pour le fun, comme je suppose que c'est un exo, on peut inverser les chaines comme ça, en utilisant le principe de la pile (structure dernier entre premier sorti) :
    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
    void inverse(char *sin, char *sout)
    {
      // il faut prendre beaucoup pour être tranquille
       char pile[1024];
       int indicepile = 0;
     
       // il faudrait ici tester qu'on ne sort pas du tableau
       while (*sin)
          pile[indicepile++] = *sin++;
     
      while (--indicepile >= 0)
          *sout++ = pile[indicepile];
     
      *sout = 0;
      return;
    }

  14. #14
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Salut

    Si ca peut être fait avec une pile, ca peut être fait sans ... (allez, juste pour le fun)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void reverse(char ** s, char ** d) { 
      if (**s) { 
        (*s)++; 
        reverse(s,d) ;
        *((*d)++) = *(--(*s)) ;
      }
    }


    Bon, ok, c'est pas des plus lisible, et il faut sauvegarder la valeur du second paramètre car elle est perdue (et elle pointe sur le résultat en plus... Enfin l'adresse qui est passée au début est cell où se trouve le résultat à la fin )

    Avec une pile c'est un peu plus lisible et quand même plus simple... Et pour éviter les débordements, le plus propre est d'alouer la taille de la pile en fonction de la taille de la chaine qu'on traite.

  15. #15
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par Smortex
    Salut
    Avec une pile c'est un peu plus lisible et quand même plus simple... Et pour éviter les débordements, le plus propre est d'alouer la taille de la pile en fonction de la taille de la chaine qu'on traite.
    Voilà le problème: allouer la taille de la pile de façon à ce qu'elle convienne précisément à ce dont nous avons besoin et pas plus. Les 3/4 des codes que j'ai vu utilise des while permettant de remplir le buffer jusqu'a....mais si je remplis trop ce buffer, je risque pas de finir de faire des plantages? De plus qq'un de malvenu ne pourrait il pas en profiter pour injecter du code comme il veut vu qu'il n'y a pas d'allocation dynamique de l'espace buffer en fonction de ce qui est entré car par exemple:
    char pile[1024] on peut en mettre des choses la dedans et comme dirait Emmanuel ici http://emmanuel-delahaye.developpez....#fflush_stdout une tampon plein est aussi un tampon incontrôlable. Faudrait un truc plus sur pour ce genre de choses. Doit bien y avoir une fonction std?

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Smortex
    Salut

    Si ca peut être fait avec une pile, ca peut être fait sans ... (allez, juste pour le fun)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void reverse(char ** s, char ** d) { 
      if (**s) { 
        (*s)++; 
        reverse(s,d) ;
        *((*d)++) = *(--(*s)) ;
      }
    }


    Bon, ok, c'est pas des plus lisible, et il faut sauvegarder la valeur du second paramètre car elle est perdue (et elle pointe sur le résultat en plus... Enfin l'adresse qui est passée au début est cell où se trouve le résultat à la fin )

    Avec une pile c'est un peu plus lisible et quand même plus simple... Et pour éviter les débordements, le plus propre est d'alouer la taille de la pile en fonction de la taille de la chaine qu'on traite.
    En récursif je propose ça qui fonctionne aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    char *inverse_recursif(char *sin, char *sout)
    {
    	char *p;
    	if (*sin)
    	{
    		p = inverse_recursif(sin+1, sout);
    		*p++ = *sin;
    	}
    	else
    		p = sout;
     
    	return p;
    }
    Appel par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *p = inverse_recursif(sin, sout);
    *p = 0;
    Gnux >> je n'ai pas utilisé strlen car le P.O. disait n'avoir pas droit au fonctions sur les chaînes.
    Le mieux est évidemment de faire un malloc de strlen(str) + 1;

Discussions similaires

  1. [Notepad++] utiliser regex pour remplacer des caractères
    Par ilood dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 04/02/2007, 04h06
  2. [XPath] Problème pour rechercher des caractères spéciaux
    Par JolyLoic dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 13/12/2006, 13h41
  3. Réponses: 3
    Dernier message: 14/11/2006, 10h45
  4. Problèmes pour sauver des caractères dans un input
    Par kalash_jako dans le forum Langage
    Réponses: 3
    Dernier message: 23/04/2006, 21h10
  5. [String] Inversion des caractères
    Par OverCat dans le forum Langage
    Réponses: 5
    Dernier message: 13/04/2005, 19h11

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