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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    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 chevronné 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
    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 ?

  3. #3
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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 Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

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

  6. #6
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    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
    Expert éminent
    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
    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...

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