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ères bizarres à la fin d'un string à la suite d'un sprintf


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut Caractères bizarres à la fin d'un string à la suite d'un sprintf
    Bonjour,

    Voilà ce que j'essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char temp[200];
    sprintf(temp,"abcdefg hijklmn opqrst  _-  . : !");
    Est-ce normal qu'après un sprintf dans un string, si on affiche les 200 caractères de ce string par exemple, on ait des caractères bizzares à la fin ?

    merci

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Avec exactement ce code-là, je dirais que non.
    Par contre, si tu lui passes une chaîne de format incorrecte ou si tu dépasses les 200 caractères, ce sera normal que ça foire.

    PS: Pou rceux qui auraient oublié, je rappelle que le second argument de sprintf() est une chaîne de format. Ne pas confondre sprintf() et strcpy().
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    Quel serait le moyen pour initialiser une chaine de caractères déclarée de façon statique svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char temp[200];
    strcpy(temp,"\0");
    marcherait ?

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Yunchi Voir le message
    Quel serait le moyen pour initialiser une chaine de caractères déclarée de façon statique svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char temp[200];
    strcpy(temp,"\0");
    marcherait ?
    suffit

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Et s'il ne s'agit pas d'une initialisation, alors on passe à ceci:
    Qui correspond exactement au code suivant, plus simple:
    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 régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    ah ok merci

    je ne pensais pas que c'était aussi simple :p

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Disons que c'est très simple si les données ne sont pas sensibles, car elles sont toujours en mémoire.
    Si tu voulais effacer tout le contenu de la chaîne (plutôt que simplement la tronquer), il faudrait que tu mette à zéro tout le buffer.

    Cela peut aussi se montrer problématique si ta chaîne n'est pas systématiquement terminée par un caractère nul (par exemple, pour certains cas de concaténations successives), car avec un buffer non-initialisé, cela peut potentiellement mener à une lecture qui déborderait du buffer.
    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.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    Euh pas tout compris pour l'histoire du buffer ...

    sinon, si on a une chaine de caractères dynamique, on doit l'initialiser comme ça ? :


  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu l'initialises à NULL ou à une adresse valide. Dans les deux cas, il ne faut pas laisser le pointeur non-initialisé.
    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.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    ok merci, j'essaye de changer mon code qui était statique en quelque chose de plus flexible mais j'ai quelques petits soucis : /

    par exemple là j'ai une erreur
    (pas de problème avec chemin_txt, en statique ça marche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FILE* fp;
    char *temp = NULL;
     
    if (!(fp= fopen(chemin_txt,"r"))) printf("Can't open the file (%s)!\n",chemin_txt);
    if (fp = fopen(chemin_txt,"r"))
    {
        fgets(temp,strlen(temp),fp);
        fclose(fp);    
    }
    Le problème doit venir de strlen(temp) car avec une constante ça marchait : /

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    Euh j'en profite pour poser une autre question :

    Quand on déclare un tableau de int, est-il possible de tous les initialiser à 0 sans passer par une boucle ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int tableau[5];
    for (i=0;i<5;i++) tableau[i] = 0;

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Seulement lors de la déclaration:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int tableau[5] = {0};
    Ce code initialise le premier entier explicitement à zéro, les quatre autres implicitement.
    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.

  13. #13
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2008
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2008
    Messages : 143
    Points : 169
    Points
    169
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Seulement lors de la déclaration:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int tableau[5] = {0};
    Ce code initialise le premier entier explicitement à zéro, les quatre autres implicitement.
    Attention !

    J'ajouterais que si on tente (par exmeple) :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int tableau[5] = {1};

    Ne pas croire que ça initialise tout a 1 !!! Cela va initialiser la premiere 'case' a 1 et les autre a 0 !

  14. #14
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Yunchi Voir le message
    ok merci, j'essaye de changer mon code qui était statique en quelque chose de plus flexible mais j'ai quelques petits soucis : /

    par exemple là j'ai une erreur
    (pas de problème avec chemin_txt, en statique ça marche)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    FILE* fp;
    char *temp = NULL;
     
    if (!(fp= fopen(chemin_txt,"r"))) printf("Can't open the file (%s)!\n",chemin_txt);
    if (fp = fopen(chemin_txt,"r"))
    {
        fgets(temp,strlen(temp),fp);
        fclose(fp);    
    }
    Le problème doit venir de strlen(temp) car avec une constante ça marchait : /
    Pourquoi essaies-tu d'ouvrir deux fois le fichier ?
    Dans l'exemple ci-dessus, temp ne contient pas l'adresse d'un buffer valide, tu ne peux donc pas l'utiliser pour lire quelquechose, il faut soit utiliser un tableau statique soit allouer dynamiquement le buffer.
    En outre strlen() n'est la fonction à utiliser ici, tu veux avoir la taille du buffer et non le nombre de caractère de la chaîne éventuellement contenue dans le buffer avant la lecture.

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 129
    Points : 83
    Points
    83
    Par défaut
    Merci pour vos réponses.

    En fait la première ouverture c'est pour indiquer s'il y a une erreur si le fichier n'existe pas ou n'est pas ouvrable

  16. #16
    Invité(e)
    Invité(e)
    Par défaut
    En fait la première ouverture c'est pour indiquer s'il y a une erreur si le fichier n'existe pas ou n'est pas ouvrable
    Mais après la première ouverture, si elle réussi, le fichier est ouvert...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FILE* fp;
    char temp[200];
     
    fp = fopen(chemin_txt,"r")
     
    if(fp != NULL) {
        fgets(temp, sizeof temp, fp);
        fclose(fp);   
    } else {
        fprintf(stderr, "Can't open the file (%s)!\n",chemin_txt); 
    }
    Si on tiens absolument à faire un allocation dynamique :

    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
    FILE* fp;
    /* EDIT : pourquoi se compliquer la vie avec malloc et memset quand calloc est là ?*/
    char * temp = calloc(200, sizeof *temp);
    if(NULL != temp) {
        fp = fopen(chemin_txt,"r")
        if(fp != NULL) {
            fgets(temp, 200, fp);
            fclose(fp);   
            /* EDIT: le free est mal placé */
            /* free(temp); */
        } else {
            fprintf(stderr, "Can't open the file (%s)!\n",chemin_txt); 
        }
        /* EDIT: la bonne place est ici */
        free(temp);
    } else {
        fprintf(stderr, "error malloc");
    }
    Dernière modification par Invité(e) ; 03/04/2009 à 22h08.

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

Discussions similaires

  1. [JDOM] caractère unicode de fin de ligne
    Par iceman dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 31/03/2009, 03h15
  2. [VB6]chaine de caractère: récupérer la fin
    Par kboo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 28/04/2006, 16h38
  3. Réponses: 6
    Dernier message: 24/03/2006, 13h50
  4. [FTP] XmlHttpRequest + caractères bizarres
    Par masseur dans le forum Langage
    Réponses: 18
    Dernier message: 25/01/2006, 16h45
  5. Réponses: 6
    Dernier message: 06/12/2005, 09h41

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