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 :

Interprétation de l’étoile en argument


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut Interprétation de l’étoile en argument
    Bonjour,

    j'ai constaté que lorsque que l'on exécute un programme via la fenêtre DOS et que l'on rentre un chemin comme celui ci en argument: "C:\Windows\*", l'argument que le programme reçoit est non pas "C:\Windows\*" mais la liste de tout les fichiers et dossiers contenu dans "C:\Windows"

    Voici un code qui permet de le constater :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main(int argc, char** argv)
    {   
        int i;
        for (i = 0; i < argc; i++)
        {
            printf("Parametre %d : %s\n",i,argv[i] );
        }
    }
    je souhaiterais recevoir exactement ce que saisie l'utilisateur en argument et non pas une interprétation.
    Est ce possible ?

  2. #2
    Membre Expert Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    787
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 787
    Par défaut
    Ben non.

    Faire pgm.exe c:\windows\* sous DOS donne bien ce que tu escomptes pour argv[1]: "c:\windows\*" (sans les guillemets)

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    je t'assure que tu te trompes edgarjacobs. si tu ne me crois pas compile ce code et exécute le :
    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 <stdlib.h>
    #include <stdio.h>
     
     
    int main(int argc, char** argv)
    {   
        int i;
     
        printf("\n TEST ");
        for (i = 0; i < argc; i++)
        {
            printf("Parametre %d : %s\n",i,argv[i] );
        }
    }
    Avec pgm.exe c:\windows\* je reçoit 103 arguments me précisant tout le contenu de mon dossier Windows alors que je voudrais recevoir tel quelle ce que saisit l'utilisateur (sans interprétation)

    Pour information en argv[1] je reçois "c:\windows\addins"

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Arnau6, edgarjacobs : utilisez-vous les mêmes versions de Windows ?

    J'ai compilé le programme sous Linux Mint, je lui passes l'argument ./* et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    pierre@pierre-mint:~/Documents/TestsC$ ./a.out ./*
     
     TEST Parametre 0 : ./a.out
    Parametre 1 : ./a.out
    Parametre 2 : ./commande.c
    Parametre 3 : ./commande.h
    Parametre 4 : ./commande.o
    Parametre 5 : ./fork_commandes_shell.c
    Parametre 6 : ./Includes
    Parametre 7 : ./main.c
    Parametre 8 : ./main.o
    Parametre 9 : ./test.c
    Parametre 10 : ./test.log
    Ce résultat me semble totalement logique car le shell interprète l'étoile qui veut dire "tout et n'importe quoi". Dans mon cas, ça donne tous les fichiers (et dossiers) du répertoire courant (.); dans le vôtre, ceux de votre dossier Windows.

    Pour confirmer cette interprétation par le shell, utilisons des guillemets simples qui servent à forcer le shell à ne pas interpréter ce qui se trouve encadré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pierre@pierre-mint:~/Documents/TestsC$ ./a.out './*'
     
     TEST Parametre 0 : ./a.out
    Parametre 1 : ./*
    Même effet avec des guillemets doubles.

    Même si le shell de Windows n'est pas le bash de Linux Mint, un fonctionnement semblable me parait être très logique et cohérent !

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 83
    Par défaut
    Merci pour cette réponse mais les simple ' ne permettent pas de saisir des chaines de caractères comme avec des "
    Ceci se constate lors qu'il y a des espaces dans le chemin. par exemple avec 'C:\Program Files (x86)'
    mon argv[1] est : 'C:\Program
    mon argv[2] est : Files
    et mon argv[3] est : (x86)'

    Est il possible d’empêcher toute interprétation des arguments pour recevoir exactement ce qui est saisi ?

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je t'avoue que j'ai un peu la flemme de booter sur Windows pour tester.

    En tout cas avec Linux (Bash) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pierre@pierre-mint:~/Documents/TestsC$ ./a.out "Mon Dossier/*"
     
     TEST Parametre 0 : ./a.out
    Parametre 1 : Mon Dossier/*
    Idem avec des guillemets simples. As-tu essayer avec des guillemets doubles ?

    Tu peux aussi essayer de "banaliser" (?) l'espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    pierre@pierre-mint:~/Documents/TestsC$ ./a.out Mon\ Dossier/*
     
     TEST Parametre 0 : ./a.out
    Parametre 1 : Mon Dossier/*

Discussions similaires

  1. Arguments pour et contre Access ?
    Par bottura dans le forum Sondages et Débats
    Réponses: 240
    Dernier message: 23/03/2018, 23h25
  2. Réponses: 1
    Dernier message: 12/09/2011, 12h17
  3. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01
  4. fonction renvoyant un tableau en argument
    Par Jones dans le forum Langage
    Réponses: 6
    Dernier message: 30/09/2002, 18h20
  5. Procédure avec un nombre variable d'arguments
    Par charly dans le forum Langage
    Réponses: 15
    Dernier message: 21/06/2002, 11h08

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