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 :

Problème avec sprintf


Sujet :

C

  1. #1
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut Problème avec sprintf
    Bonjour je souhaiterais écrie un entier dans une chaine de caratère pour ensuite écrire cette chaine dans un tube.
    J'utilse donc sprintf pour écrire dans la chaine, mais le problème c'est qu' eele écrit l'entier et beaucoup de n'importe quoi ensuite.
    Est ce que vous avez une solution pour écrire directement un entier dans le tube ou pour écrire dans une chaine avec autre chose que sprintf.
    Merci.

    Ah oui, j'ai essayé snprintf, mais ça ne change rien.

  2. #2
    Membre averti Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Points : 414
    Points
    414
    Par défaut
    verifier que le caractere '\0' est present dans votre chaine ????

    comment tu fait pour convertir la valeur vers une chaine de caracterre ?
    "La créativité est faites d'attention et de respect pour les petits faits de la vie."

  3. #3
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Avec sprintf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     char *data = (char*)malloc( sizeof(char) * MAX);
      mon_pid = getpid();
      bzero(data, MAX);
      sprintf(data,"%d",mon_pid);
    Il me semble que cette fonction sert à ça.

  4. #4
    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 juve1897
    Avec sprintf :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
     char *data = (char*)malloc( sizeof(char) * MAX);
      mon_pid = getpid();
      bzero(data, MAX);
      sprintf(data,"%d",mon_pid);
    Il me semble que cette fonction sert à ça.
    bzero() n'est oas utile ici, sprintf fait ca tres bien.

    As tu affiche le contenu de data juste apres le sprintf ?
    Quel est le resultat obtenu dans data ?
    Quelle est la valeur de MAX (au passage sizeof(char) vaut toujours 1) ?

  5. #5
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    de plus si tu utilises calloc() au lieu de malloc, il te met aussi tout à 0

  6. #6
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    En fait je ne suis plus très sûr que le problme vienne du sprintf.
    Ce que je veux faire c'est :

    Avec un fils écrire dans un tube :
    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
     
    // tube[0] est déjà fermé
     
    void fils_ecrit()
    {
      pid_t mon_pid;
      char *data = (char*)malloc( sizeof(char) * MAX);// MAX = 1024
      mon_pid = getpid();
      snprintf(data,MAX,"%d %d\n",mon_pid,3);
      printf(" data dans fils ecrit : %s\n",data);
      if(write(tube[1],data,MAX) == -1)// tube déclaré en variable global
      {
        perror(" write ");
    	exit(1);
      }
      exit(0);
    }
    Ensuite lire le tube avec le père :
    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
     
    //tube[1] est déjà fermé
     
    char* lire_tube(char *buf)
    {
      if(read(tube[0],buf, MAX) == -1)
      {
        perror(" read ");
    	exit(1);
      }
      printf(" buf dans lire tube : %s\n",buf);
     
      printf(" exit lire tube \n");
      return buf;
    }
    Puis écrire dans un fichier avec le père :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void ecrire_journal(int desc, char *buf)
    {
      printf(" dans ecrire journal buf : %s\n",buf);
      if(write(desc,buf, MAX) == -1)
      {
        perror(" write ");
    	exit(1);
      }
      exit(0);
    }
    Et c'est là le problème j'écris bien dans le fichier, mais en plus de ce que j'écris le ficher est emplie de NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL

    J'ai pensé que c'était sprintf mais en fait j'ai beau changer MAX par ce que je veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    snprintf(data,8,"%d %d\n",mon_pid,3);// 8 par exemple
    Mais ça ne change rien.

    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(write(desc,buf, 8) == -1)// là ça marche
    Mais ce n'est pas normal, y aquelque chose qui m'échappe.

  7. #7
    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
    C'est normal, tu demandes d'ecrire MAX bytes dans le fichier (dans le tube aussi d'ailleurs) quelque soit la taille reelle de la chaine.

    Il ne faut ecrire que la taille reelle de la chaine si tu ne souhaites pas avoir des caracteres supplementaires.

  8. #8
    Membre confirmé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Points : 616
    Points
    616
    Par défaut
    Il me semble que lorqu'on utilise write, on lui fournit combien il doit écrire au maximum et qu'il renvoie ce qu'il écrit réellement.
    Donc qu'on lui fournisse 1024 ou autre chose pour ecrire une chaine de quelques octets, write n'écrira que quelques octets et non 1024 cout que cout.
    C'est ce que je croiyais en tout cas et que 1024 par exemple était une limite.

  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
    Ben non: write() n'est pas une fonction orientée texte, donc elle ne va pas s'arrêter au premier zéro de la chaîne.

    On lui fournit combient elle doit écrire réellement et elle retourne combien elle a réussi à écrire.
    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
    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
    Citation Envoyé par juve1897
    Bonjour je souhaiterais écrie un entier dans une chaine de caratère pour ensuite écrire cette chaine dans un tube.
    J'utilse donc sprintf pour écrire dans la chaine, mais le problème c'est qu' eele écrit l'entier et beaucoup de n'importe quoi ensuite.
    C'est faux. Je pense que tu confonds strlen() et sizeof. Montre ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if(write(tube[1],data,MAX) == -1)// tube déclaré en variable global
    Ben non. C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      if (write (tube[1], data, strlen (data)+1) == -1)
    faut lire les docs des fonctions...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Problème avec sprintf
    Par latitude38 dans le forum Débuter
    Réponses: 23
    Dernier message: 16/04/2010, 11h19
  2. sprintf() problème avec XP seulement
    Par devdebutantajax dans le forum Débuter
    Réponses: 8
    Dernier message: 08/03/2009, 17h13
  3. Problème avec sprintf
    Par snake264 dans le forum C++
    Réponses: 10
    Dernier message: 20/04/2008, 17h12
  4. probléme avec sprintf() sous linux
    Par moooona dans le forum C++
    Réponses: 5
    Dernier message: 11/04/2008, 01h48
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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