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 confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 57
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  3. #3
    Membre confirmé
    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 : 35
    Localisation : Vietnam

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

    Informations forums :
    Inscription : Novembre 2012
    Messages : 63
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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