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 :

Comment tester la récupération du caractère * lors de l'appel d'un programme en console?


Sujet :

C++

  1. #1
    Membre actif
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 211
    Points
    211
    Par défaut Comment tester la récupération du caractère * lors de l'appel d'un programme en console?
    Bonjour,

    Mon programme est une application console.
    Je suis sous Windows 7.
    Je souhaite récupérer le caractère * saisie en paramètre de mon programme dans la console.
    * = traitement de tous les fichiers du répertoire.

    Exemple: monprogramme.exe -commande1 *

    Je voudrais mettre un message d'avertissement à l'utilisateur pour lui dire qu'il va traiter tous les fichiers du répertoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(int n, char *params[])
    {
        ...
        std::cout << "param2: " << params[2] << std::endl;
        ...
    }
    Lorsque je lance le programme avec en second paramètre * alors j'ai juste:
    "param2: ". Je ne retrouve pas le caractère *.

    Si je tente de comparer (==) le second paramètre avec une string initialisée à "*" alors l'égalité n'est pas vérifiée.

    Comme * est un caractère "joker" je suppose que c'est un cas particulier.

    Avez-vous une solution?

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 125
    Points : 33 029
    Points
    33 029
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    * n'a rien d'un caractère joker, donc aucun souci à ce niveau.
    As-tu vérifié combien vaut n ? Parser toutes les composantes de params ?
    Le 2° paramètre du main est un const char* [] normalement.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Homme Profil pro
    testeur logiciel
    Inscrit en
    Juin 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : testeur logiciel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2007
    Messages : 125
    Points : 211
    Points
    211
    Par défaut
    Merci pour ta réponse.

    Ok en fait n est égal aux nombres de fichiers (- les paramètres).
    Point de caractère * mais tous les noms des fichiers contenus dans le répertoire (1 nom par params[]). Ça parait logique en fait.
    Je pense que je vais pouvoir avancer avec cette info.

  4. #4
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Points : 70
    Points
    70
    Par défaut
    Bonjour !

    Pas sûr de beaucoup aidé mais je viens de tester plus ou moins ce que tu as mis en code, et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <iostream>
     
    int	main(int ac, char *av[])
    {
     
    	std::cout << "Param2 : " << av[2] << std::endl;
    	return (0);
    }
    (Compilé dans Visual Studio 2010 sous Windows 7 x64)

    En faisant : "prog.exe hello *", j'ai bien le '*' qui apparaît. Regarde si tu n'as pas fait d'autres opérations en amont de ton affichage avec le "std::cout" qui pourrait potentiellement causer un problème.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 125
    Points : 33 029
    Points
    33 029
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Bundy*Al Voir le message
    Ok en fait n est égal aux nombres de fichiers (- les paramètres).
    Non n est le nombre de paramètres passés à la ligne de commande qui a exécuté le fichier.
    n est toujours >= 1 puisque le premier paramètre est toujours la ligne exécutée, ou au moins le nom du fichier. Nom du fichier contenu dans argv[0] bien entendu.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Il faut savoir que, quand tu utilises la version de main basée sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char * argv[])
    le nombre minimum d'argument obtenu (celui que tu obtiens en lançant l'application avec nom_du_programme ) est... 1.

    argv[0] (car les indices sont comptés à partir de 0) vaut donc nom_du_programme, à quelques variantes près (selon le système d'exploitation, il contient le nom du dossier, ou non).

    Les arguments suivants apparaissent dans l'ordre dans lequel l'utilisateur les a indiqués, c'est à dire que si tu introduits nom_du_programme *, argc vaut bien 2, mais tu récupèreras l'astérisque dans argv[1].

    Si donc tu t'attends à obtenir l'affichage de l'astérisque avec un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int main(int argc, char * argv[])
    {
        if(argc != 3) // ben oui, pour avoir argv[2], faut trois valeurs ;)
        {
            std::cout<< "erreur : veuillez invoquer le programme sous la forme"
                     << " de mon_programme arg1 arg2";
            exit(1);
        }
        std::cout<<argv[2];
        return 0;
    }
    il faudra, comme l'indique le message d'erreur que j'ai rajouté, invoquer ton programme sous la forme de mon_programme truc *.

    Si, par contre, tu t'attends à ce que l'astérisque suive directement le nom du programme (donc que tu invoques ton programme sous la forme de mon_programme *), ce n'est pas argv[2] qu'il faudra afficher mais... argv[1]

    [EDIT]Tu pourrais d'ailleurs obtenir l'affichage de l'ensemble sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main (int argc, char * argv[])
    {
        for(int i = 0; i <argc ; ++i)
        {
            std::cout << "considere "<<argv[i]
                     <<" comme argument "<<i<< std::endl;
        }
    }
    [/EDIT]
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 2
    Dernier message: 04/03/2015, 10h44
  2. Réponses: 2
    Dernier message: 17/03/2010, 13h03
  3. Réponses: 7
    Dernier message: 22/07/2009, 18h22
  4. Erreur: "invalid path" lors de l'appel d'un programme
    Par amnass dans le forum Glassfish et Payara
    Réponses: 4
    Dernier message: 24/05/2009, 22h28
  5. [FAQ] Comment tester une chaîne de caractères avec une expression régulière ?
    Par Baptiste Wicht dans le forum Vos Contributions VBScript
    Réponses: 1
    Dernier message: 20/11/2007, 19h43

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