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 :

Caractère inatendu à l'affichage


Sujet :

C

  1. #1
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut Caractère inatendu à l'affichage
    bonjour!!
    voila j'ai la fonction suivante :

    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
     
    char* Canonise(char* strFilePath)
    {
       if (IsValid(strFilePath) != 0)
       {
          printf("la chaine ne correpond pas à un chemin \n");
          exit(-2);
       }
     
      char* strTmp;
       // Si le chemine passé en paramètre est relatif
       if (strFilePath[0] != '/')
       {
            // On construit un chemin absolu non épuré
            strTmp = GetAbsolutePath(strFilePath);
       }
       else
       {
           strTmp = strFilePath;
           printf("chemin = %s\n", strTmp);
       }
     
       char* strCan = (char*) malloc(MAX_PATH * sizeof(char));
       strCan[0] = '/';
     
       // Construction du tableau de répertoires
       int i, nIndex;
     printf("chemin = %s\n", strTmp);
    ....
    je lui passe en paramètre la chaine suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /home/hiko-seijuro/Langage-C/Projet/./include/test/../../../chemin.c
    et voici le résultat des 2 printfs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf1 :chemin = /home/hiko-seijuro/Langage-C/Projet/./include/test/../../../chemin.c
    printf2 : chemin = /home/hiko-seijuro/Langage-C/Projet/./include/test/../../../chemin.c   []
    [] représente un ptit carré !!
    vous savez a quoi c du ?
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  2. #2
    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
    Ça provient sans doute de strFilePath, savoir comment elle a été fabriquée ? Tu as un comportement indéfini, peut-être qu'il n'y a pas de zéro terminal pour le tableau de caractères qui contient la chaîne
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    elle a été obtenuye de la manière suvante :
    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
     
    char* ConstructPath(char* strFirstPart, char* strSecondPart)
    {
        // On vérifie que la seconde chaine correspond bien à un chemin relatif
        if (strSecondPart[0] == '/')
            return NULL;
     
        char* strTmp = (char*) malloc((strlen(strFirstPart) + strlen(strSecondPart)) * sizeof(char));
        strcpy(strTmp, strFirstPart);
     
        // Si jamais la première partie ne termine pas par / on le rajoute
        if (strTmp[strlen(strTmp)-1] != '/')
            strcat(strTmp, "/");
     
        // On construit le nouveau chemin
        strcat(strTmp, strSecondPart);
     
        // On le canonise
        strTmp = Canonise(strTmp);
     
        return strTmp;
    }
    il s'agit de la chaine retournéer par cette fonction
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  4. #4
    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
    Bingo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     char* strTmp = (char*) malloc((strlen(strFirstPart) + strlen(strSecondPart)) * sizeof(char));
    Oubli classique du caractère de fin de ligne, en plus si tu ajoutes des "/".
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    bon te moque pas de moi mais je vois pas !!
    tu pourrais me donner un bref exemple ?

    (merci bcp de ta patience et dsl de ma bouletitude)
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  6. #6
    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
    OK, excuse moi.
    Si tu prends la chaîne "hello", elle comporte quatre caractères, mais pour que ce soit une chaîne valide elle doit se terminer par le caractère 0x00, donc il faut 5 caractères (les fonctions d'affichage de chaînes affichent les caractères jusqu'à trouver ce fameux caractères 0).
    Lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    malloc((strlen(strFirstPart) + strlen(strSecondPart)) * sizeof(char));
    tu donnes juste le nombre de caractères de la chaîne en oubliant le zéro donc ça peut fonctionner comme ça peut planter ça dépend de l'état de la mémoire au moment de l'exécution.
    Pour les "/" regarde ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        char* strTmp = (char*) malloc((strlen(strFirstPart) + strlen(strSecondPart)) * sizeof(char));
        strcpy(strTmp, strFirstPart);
     
        // Si jamais la première partie ne termine pas par / on le rajoute
        if (strTmp[strlen(strTmp)-1] != '/')
            strcat(strTmp, "/");
     
        // On construit le nouveau chemin
        strcat(strTmp, strSecondPart);
    prenons l'exemple des chaînes "toto" et "tata"
    tu alloues pour strTmp 8 caractères.
    Mais comme toto ne se termine pas par "/" tu ajoutes le "/" puis tu termines en ajoutant "tata".
    Bilan strtmp contient "toto/tata" soit dejà 9 caractères plus le 0 final 10, tu as un débordement de 2 caractères donc comportement indéfini.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  7. #7
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    rah tu me sauves mici bcp et dsl de t'avoir dérangé autant que ca l)
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  8. #8
    Membre expérimenté Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 886
    Points : 1 526
    Points
    1 526
    Par défaut
    Citation Envoyé par Trap D
    Si tu prends la chaîne "hello", elle comporte quatre caractères, ...
    Il y a trois sortes de personnes: ceux qui savent compter et ceux qui ne savent pas compter...

  9. #9
    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

    Il y a 10 sortes de personnes, celles qui savent compter en binaire et celles qui ne savent pas 8)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. [MySQL] caractères spéciaux à l'affichage
    Par Marty000 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/05/2008, 12h12
  2. Réponses: 8
    Dernier message: 03/03/2008, 09h22
  3. Réponses: 7
    Dernier message: 22/10/2007, 20h54
  4. avoir le caractère '%' dans l'affichage de ma reqête
    Par super_dz dans le forum Sybase
    Réponses: 5
    Dernier message: 04/06/2007, 13h49
  5. Réponses: 5
    Dernier message: 24/01/2007, 23h22

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