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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bm
    bm est déconnecté
    Membre extrêmement actif

    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
    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 éclairé
    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
    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

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    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 202
    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
    }

  4. #4
    bm
    bm est déconnecté
    Membre extrêmement actif

    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
    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 expérimenté 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 : 36
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 168
    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 extrêmement actif

    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
    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 éclairé
    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
    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.

+ 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