Partage
  • Partager sur Facebook
  • Partager sur Twitter

printf()

Sujet résolu
    26 février 2010 à 3:11:49

    bonsoir,
    Alors dans code j'ai plusieurs question:
    /* printf() */
    #include <stdio.h>
    #include <stdlib.h>
    char *m1 = "Biniare";
    char *m2 = "Decimal";
    char *m3 = "Octal";
    char *m4 = "Hexadecimal";
    int main(void)
    {
        float d1 = 10000.123;
        int n;
        puts("affichage d'un nombre avec plusieur largeurs de champs");
        printf("%5f\n", d1);
        printf("%10f\n", d1);
        printf("%15f\n", d1);
        printf("%20f\n", d1);
        printf("%25f\n", d1);
        puts("Appuyez sur Entree pour continuer...");
        fflush(stdout);
        getchar();
    
        puts("\nOn utilise * pour obtenir la largeur de champs d'une variable de la liste des arguments.\n");
    
        for(n = 5; n < 25; n+=5)
            printf("%*f\n", n, d1);
    
        puts("Appuyez sur Entree pour continuer ...");
        fflush(stdin);
        getchar();
    
        puts("\nAffichage en Octal, decimale, et hexadecimal.");
        puts("On utilise # a gauche des sorties octales et hex avec 0 et 0X");
        puts("On utilise - a gauche pour justifier chaque valeur dans son champ");
        puts("On utilise d'abord le nom des colones.\n");
    
        printf("%-15s%-15s%-15s", m2, m3, m4);
    
        for(n = 1; n < 20; n++)
            printf("\n%-15d%-#15o%-#15X", n, n, n, n);
    
        puts("\n Appuyez sur Entree pour continuer ...");
        fflush(stdin);
        getchar();
    
        puts("\n\nOn utilise la commande de conversion %n pour compter");
        puts("Les caracteres. \n");
        printf("%s%s%s%s%n", m1, m2, m3, m4, &n);
    
        printf("\n\nLe dernier printf() a afficher %d caracteres.\n", n);
    
        exit(EXIT_SUCCESS);
    }
    


    affichage d'un nombre avec plusieur largeurs de champs
    10000.123047
    10000.123047
       10000.123047
            10000.123047
                 10000.123047
    Appuyez sur Entree pour continuer...
    
    
    On utilise * pour obtenir la largeur de champs d'une variable de la liste des ar
    guments.
    
    10000.123047
    10000.123047
       10000.123047
            10000.123047
    Appuyez sur Entree pour continuer ...
    
    
    Affichage en Octal, decimale, et hexadecimal.
    On utilise # a gauche des sorties octales et hex avec 0 et 0X
    On utilise - a gauche pour justifier chaque valeur dans son champ
    On utilise d'abord le nom des colones.
    
    Decimal        Octal          Hexadecimal
    1              01             0X1
    2              02             0X2
    3              03             0X3
    4              04             0X4
    5              05             0X5
    6              06             0X6
    7              07             0X7
    8              010            0X8
    9              011            0X9
    10             012            0XA
    11             013            0XB
    12             014            0XC
    13             015            0XD
    14             016            0XE
    15             017            0XF
    16             020            0X10
    17             021            0X11
    18             022            0X12
    19             023            0X13
     Appuyez sur Entree pour continuer ...
    
    
    
    On utilise la commande de conversion %n pour compter
    Les caracteres.
    
    BiniareDecimalOctalHexadecimal
    
    Le dernier printf() a afficher 20 caracteres.
    
    Process returned 0 (0x0)   execution time : 2.035 s
    Press any key to continue.



    normalement dans ce code la largeur du champ ne devrais pas être pareille la largeur du champ 2eme printf devrais être de +5 par rapport au 1er printf et pourtant la largeur du champ est pareille pourquoi ?
    puts("affichage d'un nombre avec plusieur largeurs de champs");
        printf("%5f\n", d1);
        printf("%10f\n", d1);
    



    Et dans ce code je vois pas l'utilité d'utiliser fflush ici pourquoi on l'utilise ??

    ici on me dit que "-" la sortie sera recadré a gauche plutôt qu'a droite: représente l'option par défaut.
    printf("%-15s%-15s%-15s", m2, m3, m4);
    


    mais quand je met:
    printf("%-15s%15s%-15s", m2, m3, m4);
    


    sa me donne:
    Decimal                  OctalHexadecimal
    Process returned 0 (0x0)   execution time : 0.029 s
    Press any key to continue.


    je ne comprends pas ce résultat.

    Si vous pouvez répondre a toutes ces questions ce serait cool
    • Partager sur Facebook
    • Partager sur Twitter
      26 février 2010 à 4:36:27

      Salut,

      Citation : im the big boss


      normalement dans ce code la largeur du champ ne devrais pas être pareille la largeur du champ 2eme printf devrais être de +5 par rapport au 1er printf et pourtant la largeur du champ est pareille pourquoi ?


      Citation : <man>printf

      Largeur De Champ
      Un nombre optionnel ne commençant pas par un zéro, peut indiquer une largeur minimale de champ. Si la valeur convertie occupe moins de caractères que cette largeur, elle sera complétée par des espaces à gauche (ou à droite si l'attribut d'alignement à gauche a été fourni)


      Dans ton cas, "10000.123047" comporte 12 caractères, donc pour les deux premiers cas, pas besoin de rajouter des espaces à gauche pour compléter.

      Citation : im the big boss

      Et dans ce code je vois pas l'utilité d'utiliser fflush ici pourquoi on l'utilise ??


      dans ton code tu as
      fflush(stdout);
      fflush(stdin);
      

      Pour le second c'est une bêtise, on utilise jamais fflush sur stdin.
      Pourquoi ne pas utiliser fflush pour vider le buffer clavier.
      Pour le premier,<gras></gras> à mon avis, il est inutile, puisque le buffer est purgé après un '\n', chose que fait puts.
      fflush stdout


      Citation : <man>printf


      '-'
      indique que la valeur doit être justifiée sur la limite gauche du champ (par défaut elle l'est à droite). Sauf pour la conversion n, les valeurs sont complétées à droite par des espaces, plutôt qu'a gauche par des zéros ou des blancs. Un attribut - surcharge un attribut 0 si les deux sont fournis.



      Cela correspond parfaitement au comportement de ton code, non?
      Avec le '-', les valeurs sont alignées sur à gauche(complétée à droite avec des espaces.). Par défaut les valeurs sont alignées à droite.

      printf("%-15s%15s%-15s", m2, m3, m4);
      

      Decimal                  OctalHexadecimal

      est exactement ce que tu demandes. ;)

      a+

      edit : Je n'avais pas vu ton autre post. :-°
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        26 février 2010 à 4:56:14

        ah ok et j'ai pas trop compris ton lien dans fflush(stdout) pourquoi il l'utilisait.
        printf("Entrez un nombre : ");
           fflush (stdout);
        

        et on se demande alors à quoi peut bien servir ce fflush (stdout).

        Le printf() précédent envoie une chaine de caractères à stdout. Or cette chaine n'est pas terminée par un '\n'.

        Il faut savoir que stdout est souvent un flux "bufferisé'", ce qui signifie, en bon français, que les caractères sont placés dans un tampon (buffer) de sortie avant d'être réellement émis.

        Il y a trois critères qui déclenchent l'émission réelle des caractères :

        * Le tampon d'émission est plein (incontrôlable)
        * Un '\n' a été placé dans le tampon[1]
        * La commande de forçage a été activée

        La commande de forçage est activée par l'appel de la fonction fflush (stdout), ce qui explique sa présence dans le code mentionné.

        c'est a partir de "il y a 3 critères [...] des caractères" que je n'ai pas compris

        PS: tu serais pas comment supprimer un POST parce que j'ai eu un beug et j'ai du actualiser et je me retrouve avec 2 post pareille
        • Partager sur Facebook
        • Partager sur Twitter
          26 février 2010 à 5:03:25

          Pour supprimer un post, tu peux contacter un modo.

          Citation


          Il y a trois critères qui déclenchent l'émission réelle des caractères :

          * Le tampon d'émission est plein (incontrôlable)
          * Un '\n' a été placé dans le tampon[1]
          * La commande de forçage a été activée



          Qu'est-ce que tu ne comprend pas?

          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            26 février 2010 à 5:11:13

            et ben le truc que je ne comprends c'est que il dise que la fonction printf() n'est pas terminé par '\n' puis après il explique que le flux stdout est bufferisé ensuite il explique les critères de l'émission et ben je ne comprends toujours pas pourquoi il utilise fflush(stdout)
            • Partager sur Facebook
            • Partager sur Twitter
              26 février 2010 à 5:32:45

              On utilise fflush(stdout) pour forcer "l'émission réelle des caractères :".

              Tu peux imaginer que tes caractères sont stockés en attendant qu'une de ces trois conditions soit rencontrée.

              Parfois sur certaines plateformes, si ton printf n'est pas terminé par un '\n' par exemple, tu ne verras rien à l'écran.

              Pour être certain que les caractères soient émis, il faut au moins une de ces trois conditions...

              • Partager sur Facebook
              • Partager sur Twitter
              Zeste de Savoir, le site qui en a dans le citron !
                26 février 2010 à 5:41:06

                Citation

                Parfois sur certaines plateformes, si ton printf n'est pas terminé par un '\n' par exemple, tu ne verras rien à l'écran.


                =0 ah bon, je ne savais pas

                et sinon pour:
                printf("%s%s%s%s%n", m1, m2, m3, m4, &n);
                

                pourquoi il y &n ce & n'a rien a faire ici et en plus le résultat est 20 alors que normalement si n a comme valeur le nombre de caractère de la chaine cela donne 30
                • Partager sur Facebook
                • Partager sur Twitter
                  26 février 2010 à 5:52:12

                  Citation : <man>printf

                  n
                  Le nombre de caractères déjà écrits est stocké dans l'entier indiqué par l'argument pointeur de type int *. Aucun argument n'est converti.



                  Tu passes l'adresse de ta variable(&n) à la fonction printf, pour que la fonction puisse modifier le contenu de ta variable(comme scanf).

                  Sinon, moi j'ai bien 30 en résultat. o_O

                  Par contre, ici
                  printf("\n%-15d%-#15o%-#15X", n, n, n, n);
                  

                  Tu à un n en trop. ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Zeste de Savoir, le site qui en a dans le citron !
                    26 février 2010 à 5:57:52

                    voila le code corrigé:
                    /* printf() */
                    #include <stdio.h>
                    #include <stdlib.h>
                    char *m1 = "Biniare";
                    char *m2 = "Decimal";
                    char *m3 = "Octal";
                    char *m4 = "Hexadecimal";
                    int main(void)
                    {
                        float d1 = 10000.123;
                        int n;
                        puts("affichage d'un nombre avec plusieur largeurs de champs");
                        printf("%5f\n", d1);
                        printf("%10f\n", d1);
                        printf("%15f\n", d1);
                        printf("%20f\n", d1);
                        printf("%25f\n", d1);
                        puts("Appuyez sur Entree pour continuer...");
                        fflush(stdout);
                        getchar();
                    
                        puts("\nOn utilise * pour obtenir la largeur de champs d'une variable de la liste des arguments.\n");
                    
                        for(n = 5; n < 25; n+=5)
                            printf("%*f\n", n, d1);
                    
                        puts("Appuyez sur Entree pour continuer ...");
                        fflush(stdin);
                        getchar();
                    
                        puts("\nAffichage en Octal, decimale, et hexadecimal.");
                        puts("On utilise # a gauche des sorties octales et hex avec 0 et 0X");
                        puts("On utilise - a gauche pour justifier chaque valeur dans son champ");
                        puts("On utilise d'abord le nom des colones.\n");
                    
                        printf("%-15s%-15s%-15s", m2, m3, m4);
                    
                        for(n = 1; n < 20; n++)
                            printf("\n%-15d%-#15o%-#15X", n, n, n);
                    
                        puts("\n Appuyez sur Entree pour continuer ...");
                        fflush(stdin);
                        getchar();
                    
                        puts("\n\nOn utilise la commande de conversion %n pour compter");
                        puts("Les caracteres. \n");
                        printf("%s%s%s%s%n", m1, m2, m3, m4, &n);
                    
                        printf("\n\nLe dernier printf() a afficher %d caracteres.\n", n);
                    
                        exit(EXIT_SUCCESS);
                    }
                    


                    affichage d'un nombre avec plusieur largeurs de champs
                    10000.123047
                    10000.123047
                       10000.123047
                            10000.123047
                                 10000.123047
                    Appuyez sur Entree pour continuer...
                    
                    
                    On utilise * pour obtenir la largeur de champs d'une variable de la liste des ar
                    guments.
                    
                    10000.123047
                    10000.123047
                       10000.123047
                            10000.123047
                    Appuyez sur Entree pour continuer ...
                    
                    
                    Affichage en Octal, decimale, et hexadecimal.
                    On utilise # a gauche des sorties octales et hex avec 0 et 0X
                    On utilise - a gauche pour justifier chaque valeur dans son champ
                    On utilise d'abord le nom des colones.
                    
                    Decimal        Octal          Hexadecimal
                    1              01             0X1
                    2              02             0X2
                    3              03             0X3
                    4              04             0X4
                    5              05             0X5
                    6              06             0X6
                    7              07             0X7
                    8              010            0X8
                    9              011            0X9
                    10             012            0XA
                    11             013            0XB
                    12             014            0XC
                    13             015            0XD
                    14             016            0XE
                    15             017            0XF
                    16             020            0X10
                    17             021            0X11
                    18             022            0X12
                    19             023            0X13
                     Appuyez sur Entree pour continuer ...
                    
                    
                    
                    On utilise la commande de conversion %n pour compter
                    Les caracteres.
                    
                    BiniareDecimalOctalHexadecimal
                    
                    Le dernier printf() a afficher 20 caracteres.
                    
                    Process returned 0 (0x0)   execution time : 2.329 s
                    Press any key to continue.


                    il trouve 20 caractères c'est pas normale sa
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 février 2010 à 6:13:09

                      o_O

                      C'est une colle... J'ai
                      affichage d'un nombre avec plusieur largeurs de champs
                      10000.123047
                      10000.123047
                         10000.123047
                              10000.123047
                                   10000.123047
                      Appuyez sur Entree pour continuer...
                      
                      
                      On utilise * pour obtenir la largeur de champs d'une variable de la liste des ar
                      guments.
                      
                      10000.123047
                      10000.123047
                         10000.123047
                              10000.123047
                      Appuyez sur Entree pour continuer ...
                      
                      
                      Affichage en Octal, decimale, et hexadecimal.
                      On utilise # a gauche des sorties octales et hex avec 0 et 0X
                      On utilise - a gauche pour justifier chaque valeur dans son champ
                      On utilise d'abord le nom des colones.
                      
                      Decimal        Octal          Hexadecimal
                      1              01             0X1
                      2              02             0X2
                      3              03             0X3
                      4              04             0X4
                      5              05             0X5
                      6              06             0X6
                      7              07             0X7
                      8              010            0X8
                      9              011            0X9
                      10             012            0XA
                      11             013            0XB
                      12             014            0XC
                      13             015            0XD
                      14             016            0XE
                      15             017            0XF
                      16             020            0X10
                      17             021            0X11
                      18             022            0X12
                      19             023            0X13
                       Appuyez sur Entree pour continuer ...
                      
                      
                      
                      On utilise la commande de conversion %n pour compter
                      Les caracteres.
                      
                      BiniareDecimalOctalHexadecimal
                      
                      Le dernier printf() a afficher 30 caracteres.
                      
                      Process returned 0 (0x0)   execution time : 2.093 s
                      Press any key to continue.

                      J'ai l'impression que ta variable n conserve la valeur à la fin de la boucle précédente.

                      Essaye d'initialiser n à 0, avant cette ligne
                      printf("%s%s%s%s%n", m1, m2, m3, m4, &n);
                      


                      Si tu pouvais essayer ce code
                      /* printf() */
                      #include <stdio.h>
                      #include <stdlib.h>
                      char *m1 = "Biniare";
                      char *m2 = "Decimal";
                      char *m3 = "Octal";
                      char *m4 = "Hexadecimal";
                      int main(void)
                      {
                          float d1 = 10000.123;
                          int n;
                          puts("affichage d'un nombre avec plusieur largeurs de champs");
                          printf("%5f\n", d1);
                          printf("%10f\n", d1);
                          printf("%15f\n", d1);
                          printf("%20f\n", d1);
                          printf("%25f\n", d1);
                          puts("Appuyez sur Entree pour continuer...");
                      
                          getchar();
                      
                          puts("\nOn utilise * pour obtenir la largeur de champs d'une variable de la liste des arguments.\n");
                      
                          for(n = 5; n < 25; n+=5)
                              printf("%*f\n", n, d1);
                      
                          puts("Appuyez sur Entree pour continuer ...");
                          getchar();
                      
                          puts("\nAffichage en Octal, decimale, et hexadecimal.");
                          puts("On utilise # a gauche des sorties octales et hex avec 0 et 0X");
                          puts("On utilise - a gauche pour justifier chaque valeur dans son champ");
                          puts("On utilise d'abord le nom des colones.\n");
                      
                          printf("%-15s%-15s%-15s\n", m2, m3, m4);
                      
                          for(n = 1; n < 20; n++)
                              printf("%-15d%-#15o%-#15X\n", n, n, n);
                      
                          puts("Appuyez sur Entree pour continuer ...");
                          getchar();
                      
                          puts("\n\nOn utilise la commande de conversion %n pour compter");
                          puts("Les caracteres. \n");
                         
                          printf("%s%s%s%s%n\n", m1, m2, m3, m4, &n);
                      
                          printf("\n\nLe dernier printf() a afficher %d caracteres.\n", n);
                      
                          exit(EXIT_SUCCESS);
                      }
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Zeste de Savoir, le site qui en a dans le citron !
                        26 février 2010 à 6:16:55

                        oui moi aussi j'avais l'impression que n conserver la valeur de la boucle et oui quand j'initialise n a 0 on me met que j'ai 0 caractère, j'ai essayé ton code c'est exactement pareille
                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 février 2010 à 6:20:36

                          Quel compilateur et quel os?
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Zeste de Savoir, le site qui en a dans le citron !
                            26 février 2010 à 6:24:30

                            windows seven et le compilateur aucune idée j'ai code block 8.02
                            • Partager sur Facebook
                            • Partager sur Twitter
                              26 février 2010 à 6:25:57

                              Je viens d'essayer sous visual c++, et j'ai un crash à l'éxécution...
                              Il y a une bourde que je n'ai pas vu!

                              Je regarde. :colere2:

                              On va essayer d'isoler le problème.
                              Qu'obtiens-tu avec
                              #include <stdio.h>
                              
                              int main(void)
                              {
                                  int a;
                                  char const *s = "Hello world";
                              
                                  printf("%s%n\n", s, &a);
                                  printf("%d\n", a);
                              
                                  return 0;
                              }
                              

                              ?

                              Pour visual, j'ai trouvé la raison.
                              msdn
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Zeste de Savoir, le site qui en a dans le citron !
                                26 février 2010 à 6:38:03

                                Hello world2130567168
                                
                                Process returned 0 (0x0)   execution time : 0.010 s
                                Press any key to continue.

                                voila ce que j'obtiens
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  26 février 2010 à 6:40:31

                                  OK, le %n est ignoré chez toi.

                                  Je me renseigne. ;)

                                  edit: tu peux faire sizeof(int), sizeof(short), et sizeof(char) chez toi, et me donner leur taille, stp.

                                  reedit:
                                  peux-tu essayer
                                  #include <stdio.h>
                                  #include <stdint.h>
                                  
                                  int main(void)
                                  {
                                      int32_t a;
                                      char const *s = "Hello world";
                                  
                                      printf("%s%n\n", s, &a);
                                      printf("%d\n", a);
                                  
                                      return 0;
                                  }
                                  

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Zeste de Savoir, le site qui en a dans le citron !
                                    26 février 2010 à 6:55:19

                                    4 pour int
                                    2 pour short
                                    1 pour char

                                    quand j'essaye ton code:
                                    Hello world2130567168
                                    
                                    Process returned 0 (0x0)   execution time : 0.039 s
                                    Press any key to continue.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 février 2010 à 7:19:34

                                      J'ai demandé l'avis de gens plus compétents, je te tiens au courant si j'ai du nouveau.

                                      Bonne journée. :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Zeste de Savoir, le site qui en a dans le citron !
                                        26 février 2010 à 8:00:46

                                        ah oui et aussi sa veux dire que à chaque fois que j'utiliserais printf() sans mettre '\n' je devrais vider stdout avec fflush ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          26 février 2010 à 8:29:39

                                          Oui. ;)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Zeste de Savoir, le site qui en a dans le citron !
                                            26 février 2010 à 8:37:05

                                            ah ok et dans mon livre il m'apprend le C avec la norme ANSI et peut que fflush(stdin) est autorisé avec cette norme parce que dans le livre il l'utilise cette fonction avec stdin ??
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              26 février 2010 à 8:40:24

                                              Les auteurs du bouquin se plantent.

                                              C'est quoi le titre du livre, stp?
                                              edit:

                                              Citation : GurneyH


                                              J'ai demandé l'avis de gens plus compétents, je te tiens au courant si j'ai du nouveau.


                                              Eh bien, oublie %n dans printf... :p
                                              Un lien vers la discussion...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Zeste de Savoir, le site qui en a dans le citron !
                                                26 février 2010 à 8:51:12

                                                Je ne connais pas ce livre, m'enfin, avec le coup du fflush(stdin), a première vue le contenu est à prendre avec des pincettes. :-°

                                                En cas de doutes, tu peux consulter la FAQ CLC, voire la FAQ C de developpez, et celle du SDZ ;)
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Zeste de Savoir, le site qui en a dans le citron !
                                                  28 février 2010 à 16:24:50

                                                  merci pour ton lien vers la discussion et de ton aide .
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    28 février 2010 à 16:26:47

                                                    char *m1 = "Biniare";
                                                    Binaire*
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      28 février 2010 à 16:30:17

                                                      ah désolé je n'avais pas vue la faute :p
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      printf()

                                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                      • Editeur
                                                      • Markdown