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 :

Chaines de caracteres - Bug incroyable


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut Chaines de caracteres - Bug incroyable
    Bonjour,

    Je rencontre un bug incomprehensible (en tout pour moi ca l'est) avec une chaine de caracteres de type char. Je sais, j'ai lu maintes fois qu'il fallait laisser tomber les chars pour des strings, mais toutes mes fonctions que j'utilise et qui ne m'on jamais cause de problemes fonctionnent avec des chars.

    Alors, voici le bout de code que j'ai ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char URL[256]="http://www.adressedemonsite.com";
    char File[256]="NomDeMonFichier";
    char Buffer[256];
    Telecharge(URL,File,256);
    La fonction "Telecharge" comme son nom l'indique telecharge le fichier File a partir de mon URL, avec un maximum de 256 caracteres. Le fichier que je telecharge est un simple fichier ASCII qui contient un texte, prenons comme exemple concret le texte "Mon texte". Jusque la, tout va bien. Les problemes commencent avec la suite du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cout << File << endl;
    cout << File[0] << File[1] << File [2] << File [3] << File[4] << File[5] << File[6] << File[7] << File[8] << endl
    Je vous laisse deviner l'affichage que je devrais en obtenir, mais voici celui que j'obtiens:
    Mon texte
    M
    Et la, j'avoue que je bloque. Quelqu'un peut-il m'expliquer?

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Primo, les tableaux de char pour les chaines de caractères doivent se terminer avec le caractère \0.

    Secundo, ton code fonctionne bien chez moi (GCC)

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Primo, les tableaux de char pour les chaines de caractères doivent se terminer avec le caractère \0.
    Il me semble que le caractere de fin de chaine \0 est automatiquement ajoute par le compilateur lors d'une declaration du type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char Text[]="Mon texte";

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Sans doute tu dois estropier un de tes char* dans la fonction Telecharge(), générant un pointeur fou ou quelque chose dans le style.
    Je te conseille fortement d'utiliser des string plutôt que des char* (voir la faq à ce sujet), il y a de fortes chances pour que ton problème se résolve comme par magie
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 382
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 382
    Points : 4 936
    Points
    4 936
    Par défaut
    visual studio 2008 : ça fonctionne

  6. #6
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Primo, les tableaux de char pour les chaines de caractères doivent se terminer avec le caractère \0.
    J'en tombe sur mon derrière. C'est le minimum minimorum il me semble que de savoir qu'une chaine de caractère précodée est toujours implicitement suivie d'un '\0' par le compilo. Dans cet exemple-ci il y en a même deux à la fin:

  7. #7
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Le code que tu nous montre étant correct, le problème se situe en dehors du code.

    Notamment, je pense que soit tes deux lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cout << File << endl;
    cout << File[0] << File[1] << File [2] << File [3] << File[4] << File[5] << File[6] << File[7] << File[8] << endl
    Ne sont pas à la suite.

    soit File ne se termine pas un \0 terminal, une fois sorti de Telecharge. Essaie d'inverser les deux lignes et regarde la sortie que tu obtiendras pour t'en faire une idée.

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 126
    Points : 54
    Points
    54
    Par défaut
    Ca y est j'ai trouve!

    Alors mon code etait bien tout ce qu'il y a de plus correct! C'etait un probleme venant de DevC++. J'ai simplement efface le fichier projet .dev et recree un nouveau .dev en laissant le source .cpp tel quel. Et apres recompilation ca fonctionne!

    Apparemment DevC++ ne "rebuilt" pas entierement le projet, meme quant on lui demande explicitement de le faire. Il faut manuellement effacer tout les fichiers temporaires pour etre certain qu'il recompile tout.

  9. #9
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par camboui Voir le message
    J'en tombe sur mon derrière. C'est le minimum minimorum il me semble que de savoir qu'une chaine de caractère précodée est toujours implicitement suivie d'un '\0' par le compilo. Dans cet exemple-ci il y en a même deux à la fin:
    :\

    C'est ce qui arrive quand on utilise plus char[] pour des chaines de caractère depuis plusieurs années .

    A force de savoir que les chaines de caractères doivent être terminés par un \0, on finit par croire qu'on doit toujours l'écrire soi même.

    J'vais aller faire un peu d'C pour me punir, tiens.

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    :\

    C'est ce qui arrive quand on utilise plus char[] pour des chaines de caractère depuis plusieurs années .

    A force de savoir que les chaines de caractères doivent être terminés par un \0, on finit par croire qu'on doit toujours l'écrire soi même.

    J'vais aller faire un peu d'C pour me punir, tiens.
    Récemment, j'ai eu le même problème. J'avais eu une erreur... et mal analyser la situation, que j'en suis venue à me demandant comment qu'on ajoutais un '\0' à la fin d'une chaine.

    Sinon, ValyGator, je vous conseille d'utiliser Code::Blocks, qui est très proche de Dev-cpp, mais beaucoup mieux ( et mis à jour )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Réponses: 13
    Dernier message: 13/06/2003, 14h13
  3. Pb Update avec chaine de caractere
    Par JuJu° dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 28/05/2003, 15h58
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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