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 :

sprintf (comportement bizarre selon le compilateur)


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut sprintf (comportement bizarre selon le compilateur)
    Bonjour,

    j'ai le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include <stdio.h>
    int main ()
    {
     char buffer[]="world";
     char buffer_resultat[20];
     strcpy (buffer_resultat,"Hello");
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
     puts (buffer_resultat);
     return 0;
    }
    Exécution sous windows avec TC :

    world

    Exécution sous unix AIX52

    turbo_chess@bdfced80 : /users/turbo_chess
    $ ./test
    Hello world


    une explication SVP , Emmanuel j'attends avec impatience ton analyse (le spécialiste des cas supernatural )

    merci,

    Cordialement,

    Turbo_chess

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    C'est simple, tu exécutes 2 programmes différents.

    Sous windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
    
    int main (void)
    {
     char buffer[]="world";
     char buffer_resultat[20];
     strcpy (buffer_resultat,"Hello");
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
     puts (buffer);
     return 0;
    }
    Et sous Aix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
    
    int main (void)
    {
     char buffer[]="world";
     char buffer_resultat[20];
     strcpy (buffer_resultat,"Hello");
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
     puts (buffer_resultat);
     return 0;
    }

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par crocodilex Voir le message
    C'est simple, tu exécutes 2 programmes différents.

    Sous windows :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
    
    int main (void)
    {
     char buffer[]="world";
     char buffer_resultat[20];
     strcpy (buffer_resultat,"Hello");
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
     puts (buffer_resultat);
     return 0;
    }
    Et sous Aix :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <string.h>
    
    int main (void)
    {
     char buffer[]="world";
     char buffer_resultat[20];
     strcpy (buffer_resultat,"Hello");
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
     puts (buffer_resultat);
     return 0;
    }
    bien tenté , j'ai modifié, c'est une erreur de frappe

    j'attends vos explications

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Cela n'a rien de mystérieux et la réponse figure dans la norme:

    Citation Envoyé par ISO/IEC 9899:1999, § 7.19.6.6
    The sprintf function is equivalent to fprintf, except that the output is written into
    an array (specified by the argument s) rather than to a stream. A null character is written at the end of the characters written; it is not counted as part of the returned value. If copying takes place between objects that overlap, the behavior is undefined.
    Ainsi, ton code engendre en comportement indéterminé! Tu ne peux pas concaténer une chaine de cette manière. Pour concaténer deux chaines de caractère, on utilise la fonction strncat().

    Thierry

  5. #5
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
    il y a peut-être une possibilité de comportement indéfini à partir du moment où le tampon de sortie est égal à un des arguments utilisé par la chaîne formatée (buffer_resultat dans les deux cas).

    Problème dit de "memory overlapping" qui conduit à un comportement indéfini dans la plupart des cas.

    [edit]
    "Grilled" comme on dit par chez moi

  6. #6
    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 : 68
    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
    Citation Envoyé par turbo_chess Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf (buffer_resultat,"%s %s",buffer_resultat,buffer);
    Exécution sous windows avec TC :

    world

    Exécution sous unix AIX52

    turbo_chess@bdfced80 : /users/turbo_chess
    $ ./test
    Hello world

    une explication SVP , Emmanuel j'attends avec impatience ton analyse (le spécialiste des cas supernatural)
    Il n'y a rien de bizarre. Tu invoques un comportement indéfini, tout peut arriver.

    On a pas le droit d'utiliser un même tableau comme source et comme destination en C sauf si la documentation l'autorise explicitement (memmove(), par exemple)., sinon, le comportement est indéfini.

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2002
    Messages
    168
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 168
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Merci le crocodile, neista , emmanuel et thierry pour vos réponses

    Cordialement,

    Turbo_chess

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

Discussions similaires

  1. Comportement de makefile différent selon le compilateur choisi !
    Par nonobus dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 04/06/2014, 12h46
  2. comportement (bizarre ?) du sprintf
    Par ikuzar dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 25/04/2014, 18h46
  3. [ACESS][MEMO][ISNULL]Comportement bizarre
    Par seb.49 dans le forum ASP
    Réponses: 2
    Dernier message: 09/06/2004, 11h44
  4. [HttpClient] comportement bizarre, saute des catch()...
    Par iubito dans le forum Développement Web en Java
    Réponses: 4
    Dernier message: 04/02/2004, 16h25
  5. [Sybase] Comportement bizarre d'une table
    Par sdozias dans le forum Sybase
    Réponses: 4
    Dernier message: 03/02/2004, 11h39

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