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 :

Passer un argument sur la ligne de commande


Sujet :

C++

  1. #1
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut Passer un argument sur la ligne de commande
    Bonjour,

    Lorsque je lance en mode console ./vbd , je veux inclure sur cette ligne un argument numérique ou string tel que :

    ./vbd ('ok')
    bash: Erreur de syntaxe près du symbole inattendu « "ok" »

    C'est pour éviter un 'enter' clavier . Est ce que c'est possible ?

    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
     
    #include <iostream>
    #include <cstring>
    using namespace std;
     
    int main(){
       char str1[10] = "Hello";
       char str2[10] = "World";
       char str3[10];
       string nomUtilisateur("Albert Einstein");
     
       cin  >>str3;
       // concatenates str1 and str2
       strcat( str1, str3);
       cout << "strcat( str1, str3): " << str1 << endl;
       cout << nomUtilisateur +"  est connu avec : " +str2<< endl;
     
        return 0;
    }
    @+

  2. #2
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    Salut,

    Quand tu tappes sur ton shell ./monprogramme argument, argument est récupérable via les arguments du main. (c'est à dire pas avec std::cin)

    Pour cela, il faut changer la signature du main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int main(int argc, char **argv)
    {
      // code ici
    }
    La variable argc représente le nombre d'argument. puis le char** ou char *argv[] (ça dépend des écoles) contient les arguments eux même.

    Donc normalement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cout << argv[1] << std::endl;
    devrait donc afficher : ('ok')
    Attention aussi, les parenthèses sous bash correspondent au lancement d'un sous-shell, il faut échapper les caractères pour avoir la chaîne de caractères ('ok') en tant que paramètre du programme.


    Remarque : Le nom du programme est toujours envoyé par défaut, donc dans l'exemple ./monprogramme argument, argc = 2 et argv contient ./monprogramme et argument.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Petites informations complémentaires
    La norme garantit aussi que argv[argc] == 0.

    Les guillemets dans la commande console crée une chaine, pouvant contenir des espaces.
    ainsi ./prog arg1 2 "3 4" "argument très long" autre argument long -p -f "./data & settings/1.png" produira un argv comme s'il avait été déclaré ainsi:
    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
     argv = {
        "./prog",
        "arg1",
        "./prog",
        "arg1",
        "2",
        "3 4",
        "argument très long",
        "autre",
        "argument",
        "long",
        "-p",
        "-f",
        "./data & settings/1.png",
        0 == NULL
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    msi-ubuntu@msi-ubuntu:~/Documents/ing_prob/0-mooc/vbd/bin/Debug$ ./vbd ("gg")
    bash: Erreur de syntaxe près du symbole inattendu « "gg" »

    msi-ubuntu@msi-ubuntu:~/Documents/ing_prob/0-mooc/vbd/bin/Debug$ ./vbd kkk
    kkk
    strcat( str1, argv[1]): Hellokkk
    Albert Einstein est connu avec : World
    ok merci - mais les caractères autres que alphanumériques renvoi " symbole inattendu "

  5. #5
    Membre averti Avatar de RPGamer
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Mars 2010
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    Points : 395
    Points
    395
    Par défaut
    Tu peux traiter des options passées à ton programme avec la fonction getopt() :

    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
    #include <unistd.h>
    #include <iostream>
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        switch (getopt(argc, argv, "habc"))
        {
            case 'h':
            {
                 cout << "Arguments:" << endl;
                 cout << " -a" << '\t' << "Option A." << endl;
                 cout << " -b" << '\t' << "Option B." << endl;
                 cout << " -c" << '\t' << "Option C." << endl;
                 cout << " -h" << '\t' << "Affiche cette aide." << endl;
                 break;
            }
            case 'a':
            {
                cout << "option a" << endl;
                break;
            }
            case 'b':
            {
                cout << "option b" << endl;
                break;
            }
            case 'c':
            {
                cout << "option c" << endl;
                break;
            }
        }
     
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ ./program -h
    Arguments:
     -a	Option A.
     -b	Option B.
     -c	Option C.
     -h	Affiche cette aide.

  6. #6
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    Je peux me passer des caractères spéciaux en argument.

    Qu'est ce qui peux les rendre acceptables avec C++ ?



    [Résolu]

  7. #7
    Membre éprouvé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Points : 917
    Points
    917
    Par défaut
    tu ne lis pas les réponses :

    Auto-citation
    Attention aussi, les parenthèses sous bash correspondent au lancement d'un sous-shell, il faut échapper les caractères pour avoir la chaîne de caractères ('ok') en tant que paramètre du programme.

  8. #8
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    tu ne lis pas les réponses :
    Attention aussi, les parenthèses sous bash correspondent au lancement d'un sous-shell, il faut échapper les caractères pour avoir la chaîne de caractères ('ok') en tant que paramètre du programme.
    Je ne peux pas aller plus vite, et pas sûr que " les parenthèses sous bash" dépendent de cette progression.

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Ce n'est pas un problème du programme C mais ta méconnaissance des shells. Les erreurs viennent de ton interpréteur. Je n'ai pas l'impression que tu réalises que les shells disposent d'un langage qui leur est propre où la plupart des caractères non alphanumérique ont un comportement dédié.

    ./monprog '!@#$%^&*()_'

  10. #10
    bm
    bm est déconnecté
    Membre confirmé

    Homme Profil pro
    Freelance
    Inscrit en
    Octobre 2002
    Messages
    874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Freelance
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2002
    Messages : 874
    Points : 556
    Points
    556
    Billets dans le blog
    6
    Par défaut
    | symbole pour les pipes
    && et logique
    || ou logique
    ;séparateur de commandes
    ;;délimitateur de case
    &commandes background
    ( )groupement de commandes
    <redirection de l’entrée
    <<entrée en here-document
    >création de sortie
    >>rajout de sortie

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Tu peux en ajouter:
    ! extension d'historique
    $ utilisation de variable
    ? j'sais pas
    * globbing
    ~ alias pour $HOME
    ` exécuteur de commande
    \ échappement
    ' délimiteur de chaîne de caractère
    " délimiteur de chaîne de caractère évaluée
    { délimiteur de séquence ({n..m} ou {n..m..step})
    Et encore d'autres spécifiques aux interpréteurs (=, [, alias global, etc).

    Si tu veux envoyer des options avec des caractères exotique, utilises des quotes.

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

Discussions similaires

  1. passer un objet en tant qu'argument dans la ligne de commande
    Par skoobi dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2014, 22h42
  2. Saisie d'arguments dans la ligne de commande
    Par sangei dans le forum Général Java
    Réponses: 20
    Dernier message: 06/12/2009, 16h08
  3. Réponses: 5
    Dernier message: 11/07/2006, 17h32
  4. récupérer les arguments de la ligne de commande
    Par gblanc dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 13/10/2005, 23h08
  5. 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

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