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 :

parseur d'options pour arguments en ligne de commande


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut parseur d'options pour arguments en ligne de commande
    Bonjour,

    j'aimerait inserer dans un char * toute les options entrées par l'uilisateur du type ./nom_prog -a -abc en faisant un vérification au prealable.

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    int	get_nb_optargs(int argc, char **argv)
    {
      int	i;
      int	nb_args;
     
      i = 1;
      nb_args = 0;
      while (i < argc)
        {
          if (argv[i][0] == '-')
    	nb_args = nb_args + my_strlen(argv[i] + 1);
          i = i + 1;
        }
      return (nb_args); 
    }
     
    int	check_opt(char *opt, char to_find)
    {
      int	i;
      int	ret;
     
      ret = 1;
      i = 0;
      while (opt[i] != '\0')
        if (opt[i] == to_find)
          ret = 0;
      return (ret);
    }
     
    char	*add_opt(char *opt, char to_add)
    {
      int	i;
     
      i = my_strlen(opt);
      *(opt + i) = to_add;
      *(opt + i + 1) = '\0';
      return (opt);
    }
     
    char	*get_optargs(int argc, char **argv)
    {
      int		i;
      int		iargs;
      int		nb_args;
      char		*opt;
     
      my_put_nbr(get_nb_optargs(argc, argv));
      my_putchar('\n');
      opt = malloc(50 * sizeof(char));
      i = 1;
      while (i < argc)
        {
          if (argv[i][0] == '-')
    	{
    	  iargs = 1;
    	  while (argv[i][iargs] != '\0')
    	    {
    	      printf("%c\n", argv[i][iargs]);
    	      if (check_opt(opt, argv[i][iargs]))
    		{
    		  opt[my_strlen(opt)] = argv[i][iargs];
    		  opt[my_strlen(opt) + 1] = '\0';
    		}
    	      printf("opt = %s \n", opt);
    	      iargs = iargs + 1;
    	    }
    	}
          i = i + 1;
        }
     
      return (opt);
    }
    ce que le programme m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    david@david-nux ~/Projets_C/my_ls $ ./a.out -opr -o -k -ll
    nb_pathargs = 0
    7
    o
    opt = o 
    p
    Apparament la boucle se stoppe pour une raison que je ne comprend pas.
    Aurais-je commit une boulette?

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    Points : 58
    Points
    58
    Par défaut
    je viens de trouver ma boulette: je n'imcrémente pas mon i dans la boucle de check_opt

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Etudiant En dev jeux video ESGI. Dev c/c++
    Inscrit en
    Novembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Vietnam

    Informations professionnelles :
    Activité : Etudiant En dev jeux video ESGI. Dev c/c++

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Escuse moi si je n'ais pas le droit de reprendre une discussion.

    Mais je suis tomber sur ton topic. Et je me suis dit ... hein?!

    c'est à propos de argv. je pensais quèil recupere les arguments de cette maniere: grep toto tata.txt
    argv[0]= grep argv[1] = toto ....
    alors maintenant je me pose cette question ... que fait argv[1][2] par exemple et les autre cellules?

    c'est assez urgent si quelqu un pouvais me repondre(je crois que j'en ais besoin je doit coder un grep)

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    argv est un char ** donc argv[i] est un char * soit ici une chaîne de caractère donc argv[i][j] est la j+1 ième caractère de l'argument i.

    C'est à dire que si on tape "commande toto 123456"
    argv[0][0] => 'c'
    argv[1][4] => '\0'
    argv[2][3] => '4'

    Quand tu as une question, créé un sujet plutôt que de déterrer les anciens.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/02/2011, 15h33
  2. Réponses: 27
    Dernier message: 14/12/2006, 19h49
  3. Aucune limite pour max_user_connections en ligne de commande
    Par Thierry8 dans le forum Installation
    Réponses: 3
    Dernier message: 28/03/2006, 11h43
  4. taille max des arguments en ligne de commande
    Par clepape dans le forum Langage
    Réponses: 2
    Dernier message: 08/10/2005, 13h18
  5. Réponses: 3
    Dernier message: 07/04/2003, 20h06

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