Partage
  • Partager sur Facebook
  • Partager sur Twitter

Chaine de caractères en ligne de commande

Sujet résolu
    18 avril 2023 à 0:05:26

    Bonjour à tous, 

    Je voudrai créer un programme qui va recevoir une chaine de caractères en ligne de commande et afficher chaque caractère de la dite chaine sur une ligne. Exemple "Hello"   =>  H-e-l-l-o ou H e l l o

    J'aimerai :

        - option 1 utiliser le nom de la chaine pour la parcourir 

        - option 2 utiliser un pointeur 

    Voici le code sur lequel je travaille : 

    #include <stdio.h>
    
    #include<string.h>
    
    #include<stdlib.h>
    
    
    int main(int argc, char * argv[]) {
      if (argc < 2) {
        fprintf(stderr, "manipuler arg\n => Il faut un argument\n");
        exit(0);
      }
      int limit = strlen(argv[1]) - 1;
    
      #ifndef POINTEUR
      int i = 0;
      puts("Affichage 1 :");
      while (i < limit)
        printf("%c - ", argv[1][i++]);
      printf("%c\n", argv[1][i]);
    
      #endif
    
      #ifdef POINTEUR
      puts("Affichage 2 :");
      char * p = argv[1];
      while (limit--)
        printf("%c - ", * p++);
      printf("%c\n", * p);
      
      #endif
      return 0;
    }

    Merci d'avance pour votre aide :)



    -
    Edité par Fat. C. 18 avril 2023 à 13:45:08

    • Partager sur Facebook
    • Partager sur Twitter
      18 avril 2023 à 0:46:18

      Ton code semble fonctionner, tu bloques sur quoi ?

      Avec le pointeur tu peux tester le caractère nul '\0' de fin de chaîne pour l'arrêt de la boucle ce qui évite d'utiliser la taille de la chaîne (limit).

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        18 avril 2023 à 2:49:28

        J'ai fait un copier-coller de ton code et je l'ai testé. Ton code semble fonctionner dans chacun des deux modes.
        Dans l'exemple, il n'y a pas d'espace de chaque côté du '-', vérifies ton format ("%c - ").
        Autre chose, si tu as une chaîne du genre:  je suis le diable
        Le premier paramètre sera seulement  je
        Il faut placer la phrase entre des " "
        "je suis le diable"

        On peut fonctionner autrement pour le séparateur:
         
            char *sep = "";
            for(int i = 0; argv[1][i]; i++, sep = " - ")
                printf("%s%c", sep, argv[1][i]);
            printf("\n");

        -
        Edité par PierrotLeFou 18 avril 2023 à 3:05:48

        • Partager sur Facebook
        • Partager sur Twitter

        Le Tout est souvent plus grand que la somme de ses parties.

          19 avril 2023 à 18:34:50

          Va y avoir des problèmes dans un environnement où les caractères sont codés en UTF-8 (1 caractère => 1 ou plusieurs octets).

          EDIT :  Dans un environnement UTF-8, si on appelle la fonction

          void eight_bit_spacing(const char *string)
          {
              printf("8bit\t");
              char *delimiter = "";
              for (const char *p = string; *p != '\0'; p++) {
                  printf("%s%c", delimiter, *p);
                  delimiter = " ";
              }
              printf("\n");
          }

          sur la chaîne "bientôt l'été", on obtient

          8bit    b i e n t � � t   l ' � � t � �

          ce qui est ravissant, mais ne fait pas tout à fait le boulot.

          ---

          Pour que ça marche avec les lettres accentuées et tout ça, il faut analyser la chaîne, pour déterminer les octets qui commencent le codage d'un caractère.

          #include <stdio.h>
          #include <stdlib.h>
          #include <stdbool.h>
          /*
          	Avec utf8, les caractères Unicode sont codés
          	- soit sur un octet (pour ceux qui correspondent au code US-ASCII 7 bits)
          	- soit sur une séquence de 2, 3 ou 4
          
          	Dans le premier cas, le bit de gauche de l'octet est à 0
          	Pour les autres cas
          	- le premier octet commence par 110, 1110 ou 11110
          	selon que c'est une séquence de 2, 3, ou 4 octets
          	- les octets suivants commencent par 10
          */
          
          bool  is_ascii_char(char c)
          {
              return (c & 0x80) == 0;
          }
          
          bool  is_first_byte(char c)
          {
              // le premier octet d'une séquence commence par 11
              return (c & 0xC0) == 0xC0;
          }
          
          void utf8_spacing(const char *string)
          
          {
              printf("utf8\t");
              char *spacing = "";
              for (const char *p = string; *p != '\0'; p++) {
                  if (is_ascii_char(*p) || is_first_byte(*p)) {
                      printf("%s", spacing);
                      spacing = " ";
                  }
                  printf("%c", *p);
              }
              printf("\n");
          }
          
          
          void eight_bit_spacing(const char *string)
          {
              printf("8bit\t");
              char *delimiter = "";
              for (const char *p = string; *p != '\0'; p++) {
                  printf("%s%c", delimiter, *p);
                  delimiter = " ";
              }
              printf("\n");
          }
          
          int main(int argc, char *argv[])
          {
              printf("Spacings\n");
          
              for (int i = 1; i < argc; i++) {
                  printf("string\t\"%s\"\n", argv[i]);
                  eight_bit_spacing(argv[i]);
                  utf8_spacing(argv[i]);
              }
          
              return EXIT_SUCCESS;
          }
          

          Exécution,

          $ ./prog "bientôt l'été"
          Spacings
          string  "bientôt l'été"
          8bit    b i e n t � � t   l ' � � t � �
          utf8    b i e n t ô t   l ' é t é




          Documentation utilisés :  https://fr.wikipedia.org/wiki/UTF-8







          -
          Edité par michelbillaud 26 avril 2023 à 12:00:17

          • Partager sur Facebook
          • Partager sur Twitter

          Chaine de caractères en ligne de commande

          × 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