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 :

Affichage comme la commande man avec printf en C


Sujet :

C

  1. #1
    Membre à l'essai Avatar de dylan7581
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Par défaut Affichage comme la commande man avec printf en C
    Bonjour,

    je voudrait faire 2 affichages pour mon programme, lorsque j’exécute mon programme en ligne de commande, l'un qui saura du style la commande 'man' comme par exemple ceci :

    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
    19
    20
    21
    22
    23
     
    PRINTF(1)                        User Commands                        PRINTF(1)
     
    NAME
           printf - format and print data
     
    SYNOPSIS
           printf FORMAT [ARGUMENT]...
           printf OPTION
     
    DESCRIPTION
           Print ARGUMENT(s) according to FORMAT, or execute according to OPTION:
     
           --help display this help and exit
     
           --version
                  output version information and exit
     
           FORMAT controls the output as in C printf.  Interpreted sequences are:
     
           \"     double quote
     
           \\     backslash
    et l'autre comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      -t, --option   l'explication de l'option qui peut 
                     parfois être sur plusieurs ligne, 
                     mais qui reste aligné.
     
          --help     Display this help and exit.
     
          --man      Display this help following man-style
                     and exit.
    J'ai essayé de le faire avec un printf pour la 2e (je n'ai pas encore réfléchit pour la première mais comme je suis là... ) mais je galère pour afficher une option qui aurait une explication trop longue! Voici que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // ficher test d'affichage
    int main(void) {
        char *s = "l'explication de l'option qui peut parfois être sur plusieurs lignes"
                      " mais qui reste aligné.";
        printf("%-20s\t%s\n", "  -t, --option", s);
        return EXIT_SUCCESS;
    }
    Voici le résultat qui n'est pas aligné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      -t, --option          l'explication de l'option qui peut parfois être sur plus
    ieurs lignes mais qui reste aligné.
    Quelqu'un aurait-il une idée?

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    C'est plus ou moins galère selon le nombre d'encodages différents à prendre en compte. Pour le faire à la main tu as de toute manière besoin de connaître la longueur de ligne disponible, soit en la fixant soit en la récupérant depuis le terminal.

    Ensuite tu peux par exemple utiliser le spécificateur de précision, soit en statique : printf("%.40s\n", s);, soit en dynamique : printf("%.*s\n", 40, s); . Note qu'il s'agit de bytes et non de caractères..

  3. #3
    Membre à l'essai Avatar de dylan7581
    Homme Profil pro
    Lycéen
    Inscrit en
    Mai 2017
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2017
    Messages : 3
    Par défaut
    Merci à toi Matt_Houston, j'avais oublié qu'on pouvez mettre une "*" pour spécifier les espacements, etc...

    Du coup, pour aider d'autre voici comment j'ai fait une option et ça description :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <sys/ioctl.h>
     
    void print_para_help(const char *option1, const char *option2,
        const char *description);
     
    int main(void) {
      char *s = "l'explication de l'option qui peut parfois être sur plusieurs "
                      "lignes mais qui reste aligné.";
      print_para_help("-h", "--help", s);
      printf("\n");
      return EXIT_SUCCESS;
    }
     
    #define ESP 2    // Espaces avant option1
    #define OPT1 2   // Nombre de case accueillant option1
    #define VIRG 2   // Nombre de case accueillant la virgule
    #define OPT2 18  // Nombre de case accueillant option2
    #define SPACE (ESP + OPT1 + VIRG + OPT2) // espaces après le retour à la ligne lorsque description est long
     
    void print_para_help(const char *option1, const char *option2,
        const char *description) {
      struct winsize w;
      ioctl(0, TIOCGWINSZ, &w);
      char *virgule = "";
      if (strcmp(option1, "") != 0) {
        virgule = ", ";
      }
      printf("%-*s%-*s%-*s%-*s", ESP, " ", OPT1, option1, VIRG, virgule, OPT2,
          option2);
      int k = SPACE;
      size_t i = 0;
      const char *s = description;
      while (s[i] != '\0') {
        if (k >= w.ws_col - 1) {
          printf("\n%-*s", SPACE, "");
          k = SPACE;
        }
        printf("%c", s[i]);
        ++i;
        ++k;
      }
      printf("\n");
    }

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

Discussions similaires

  1. [Python 3.X] IDLE Ré-affichage d'une commande erronée avec l'éditeur Idle
    Par cabon dans le forum Général Python
    Réponses: 2
    Dernier message: 15/08/2018, 11h21
  2. [NASM / Linux][Débutant] Segmentation fault affichage avec printf
    Par donkeyquote dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/11/2008, 19h00
  3. la précision d'affichage avec printf
    Par mony84 dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 13/09/2008, 00h29
  4. [Débutant] pb affichage du "\" avec printf
    Par jocelyn54 dans le forum Bibliothèque standard
    Réponses: 5
    Dernier message: 24/01/2008, 11h02
  5. problème d'affichage avec printf
    Par sorari dans le forum C++
    Réponses: 12
    Dernier message: 08/03/2005, 18h30

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