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 :

sscanf + recuperation de deux chaines


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut sscanf + recuperation de deux chaines
    bonjour en fait j'effectue la commande suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char old[50];
    char newf[50];
     
    int c = sscanf (optarg, "%s%s", oldf, newf);
    /*optarg étant un char * de la librairie getopt.h */
    	if (c != 2)
    	  { 
                   printf("caractere ecrit : %d",c);
    	      fprintf (stderr, "Bad argument for -i option\n");
     
    	    exit (1);
    	  }
    il repére toujours ma premiére chaine mais la deuxieme il ne veut pas la reperer.
    le sscanf me retourne toujours 1 et pas 2, j'ai essayé avec %s-%s sans succés

    Merci

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bonjour69
    bonjour en fait j'effectue la commande suivante :
    Pas de commande en C. Des instructions, des fonctions...
    il repére toujours ma premiére chaine mais la deuxieme il ne veut pas la reperer.
    le sscanf me retourne toujours 1 et pas 2, j'ai essayé avec %s-%s sans succés
    Aucun problème avec ce code
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       char const *optarg = "ab cd";
     
       char oldf[50];
       char newf[50];
     
       int n = sscanf (optarg, "%s%s", oldf, newf);
       if (n != 2)
       {
          printf ("Nb conversions reussies : %d", n);
          fprintf (stderr, "Bad argument for -i option\n");
     
       }
       printf ("'%s' '%s'\n", oldf, newf);
       return 0;
    }
    Je te conseille d'afficher 'optarg', parce que je pense qu'il y a quelque chose que tu n'as pas compris avec les arguments de la ligne de commande.

    Explique exactement ce que tu veux faire et on verra quels moyens mettre en oeuvre. Mon petit doigt me dit que de sortir getopt pour récuperer 2 arguments, c'est totalement inutile.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut
    Bonjour,

    en fait j'utilise la libraire getopt pour utiliser mon programme en ligne de commande.
    je veux donc extraire deux chaines qui correspondent en fait a deux noms de fichiers auquels j'effectue un traitement par la suite.
    genre si par exemple un utilisateur tape monprog -i fichier1 fichier2

    que je puisse recuperer mes deux chaines pour effectuer les traitements.
    Apparement avec votre exemple, mon programme plante.


    Merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut
    Re ,
    enfait je me suis trompé il ne plante pas, mais ne recupere pas le deuxieme chaine il lit tout le temps que la premiére.

    dans le nombre de conversion réussi j'en ai qu'une seule.

    d'ailleur quand j'affiche optarg, il me m'affiche que la première chaine :/
    Merci

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bonjour69
    Re ,
    enfait je me suis trompé il ne plante pas, mais ne recupere pas le deuxieme chaine il lit tout le temps que la premiére.

    dans le nombre de conversion réussi j'en ai qu'une seule.

    d'ailleur quand j'affiche optarg, il me m'affiche que la première chaine :/
    Merci
    Voila. C'est ça que je voulais que tu constates.

    En fait, chaque paramètre de la ligne de commande est séparé par un espace. Ensuite, chaque paramètre peut être analysé par getopt, mais il ne doit pas y avoir d'espace.

    Tu dois revoir ta syntaxe.
    Je ne sais pas à quoi sert -i, mais il me semble que

    monprog fichier1 fichier2

    devrait suffire.

    Et ça s'analyse très simplement avec les paramètres de main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int main (int argc, char **argv)
    {
       if (argc > 2)
       {
          char *oldf = argv[1];
          char *newf = argv[2];
          printf ("'%s' '%s'\n", oldf, newf);
       }
     
       return 0;
    }
    On peut toujours faire plus compliqué, mais il faut que ce soit justifié et qu'il y ait une syntaxe cohérente.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 135
    Par défaut
    bonjour,

    Oui en effet merci, je pourrais faire comme cela mais en fait on m'oblige d'utilise la librairie getopt.
    je ne comprends pas trop l'histoire de optarg, apparement tous les arguments sont stockés dans une et une seule chaine coupés par des espaces ?
    j'ai beau afficher optarg( printf("%s",optarg)) , il s'arrete au premier espace et ne va plus loin. Comment puis-je donc recuperer ces deux arguments contenu dans la chaine ?
    ma syntaxe de sscanf n'est pas adapté ?


    Voici mon code complet pour être plus clair.
    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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #define VERSION "1.0"
     
     
    struct option longopts[] = {
      {"help", no_argument, NULL, 'h'},
      {"version", no_argument, NULL, 'v'},
      {"recursive", required_argument, NULL, 'r'},
      {"inverse", required_argument, NULL, 'i'},
      {"directe",required_argument, NULL, 'd'},
     {NULL, 0, NULL, 0}
    };
     
     
    static char *progname;
    int flagh = 0, flagv = 0, flagr = 0, flagi = 0,flagd =0,lose = 0;
    char oldf[50];
    char newf[50];
     
     
     
    char *ofile = NULL;
    int a,b;
     
     
    int main (int argc, char *argv[])
    {
      int optc;
     
     
      progname = argv[0];
     
      while ((optc =
    	  getopt_long (argc, argv, "hvr:i:", longopts,
    		       (int *) 0)) != -1)
        switch (optc)
          {
          case 'h':
    	flagh = 1;
    	break;
          case 'v':
    	flagv = 1;
    	break;
          case 'r':
    	flagr = 1;
     
     
    	break;
          case 'i':
    	flagi = 1;
     
     
       if (sscanf (optarg, "%s%s", oldf,newf ) !=2 )
       {
     
          fprintf (stderr, "Bad argument for -i option\n");
     
       }
       /* ne marche pas */ 
     
    	break; 
          case 'd':
    	flagv = 1;
    	break;             
         default:
     
    	lose = 1;
    	break;
          }
     
     
     
      if (lose || optind < argc)
        {
          if (optind < argc)
    	fprintf (stderr, "Too many arguments\n");
          fprintf (stderr, "Try `%s --help' for more information.\n", progname);
          exit (1);
        }
     
     
    // help 
      if (flagh)
        {
    etc.. pour tous les flags...
    Merci

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

Discussions similaires

  1. comparer deux chaines de caractères
    Par peuf23 dans le forum Langage
    Réponses: 3
    Dernier message: 30/01/2006, 14h31
  2. Réponses: 4
    Dernier message: 06/12/2005, 15h12
  3. [langage] récupération d'une chaine
    Par sasame dans le forum Langage
    Réponses: 11
    Dernier message: 21/01/2005, 07h33
  4. Réponses: 5
    Dernier message: 06/10/2003, 17h49
  5. Script test de deux chaine avec if
    Par kacedda dans le forum Linux
    Réponses: 6
    Dernier message: 02/05/2003, 15h38

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