1
votes

où lire l'entrée cmd comme "myapp.exe input" ou "myapp.exe -?" (j'utilise cmd)

Lorsque j'utilise Java, je dois taper une commande comme java -? Si l'utilisateur saisit -? à la fin, pourquoi l'application sait-elle cela pour répondre à la sortie? Veuillez me dire le code c pour identifier le -?

c

0 commentaires

4 Réponses :


1
votes

Ils sont passés comme paramètres à main ():

Arg 0 is myProgram.exe
Arg 1 is arg1
Arg 2 is stuff
Arg 3 is ?

Une fois compilés puis exécutés en tant que

myProgram.exe arg1 stuff ?

Cela afficherait

#include <stdio.h>

int main(int argc, const char* argv[])
{
    for (int i = 0; i < argc; i++) {
        printf("Arg %i is %s\n", i, argv[i]);
    }
}


2 commentaires

Également important dans votre exemple, Arg 4 NULL ; Pourquoi? argv est un tableau-de-pointeurs où le pointeur qui suit le dernier argument est positionné à NULL .


J'ai parcouru un peu le standard C et il semble que votre définition de main ne soit pas standard: "Les paramètres argc et argv et les chaînes pointées par le tableau argv seront modifiables par le programme [ ...] "donc const * argv [] n'est apparemment pas correct selon la norme.



0
votes

En C, le main est déclaré comme:

#include<string.h>
#include<stdio.h>

#define QUESTION_MARK "-?"

int main(int argc, char **argv){
    if(argc > 1){
        char *qsmark = argv[1];
        if(strcmp(qsmark, QUESTION_MARK) == 0){
            printf("argv[1] is -?\n");
        }
    }
    return 0;
}

le premier argument est le nombre de paramètres tandis que le second est un tableau de paramètres donc, par exemple dans votre cas, vous feriez :

int main(int argc, char** argv);

N'oubliez pas que le premier argv est le nom de l'exécutable. Veuillez éviter de comparer la chaîne à la main, utilisez la bibliothèque standard pour savoir si ce qui est pointé par qsmark est en fait égal à "-?"


3 commentaires

Je crois que strcmp () est la fonction de bibliothèque standard dans string.h que vous recherchez.


Certes, bien que ce soit plus une note secondaire, c'est pourquoi je ne l'ai pas spécifié. Si cela rend le code plus clair, je le modifierai


Vous pouvez, c'était clair ce que vous suggériez, mais rappelez-vous, en tant qu'enseignant, votre élève en saura beaucoup moins que vous et venant probablement de Java, il n'a aucune idée des fonctions de comparaison de chaînes disponibles ou de l'endroit où elles peuvent être trouvées. Il vaut toujours la peine de laisser tomber au moins une phrase pour les envoyer dans la bonne direction avec de nouvelles connaissances.



1
votes

Dans C , vous avez trois options pour votre signature principale . Le premier est celui qui ne prend aucun paramètre int main (void) . Le second int main () comme mentionné dans les commentaires prend n'importe quel nombre de paramètres mais ils ne sont pas nommés. Le troisième a cependant deux paramètres int main (int argc, char ** argv) les noms des paramètres n'ont pas d'importance, ils sont juste couramment utilisés. Ces deux paramètres servent à fournir les paramètres de ligne de commande à votre programme.

  • argc: est la variable de compteur qui contient le nombre d'arguments fournis séparés par des espaces
  • argv: contient les arguments de la ligne de commande sous forme de tableau de chaînes en C

Votre programme reçoit implicitement toujours un argument qui est le nom de l'application (ou \ 0 si l'environnement hôte ne peut pas le fournir). Voici un petit exemple pour parcourir les arguments:

#include <stdio.h>

int main(int argc, char **argv) {
    for(int i = 0; i < argc; i++) {
        printf("%s\n", argv[i]);
    }
}


2 commentaires

Techniquement, pour les implémentations conformes , il s'agit de int main (void) , laissant les parenthèses vides () spécifie un nombre indéterminé d'arguments. Voir C11 Standard - §5.1.2.2.1 Démarrage du programme ( p1) . (note: de nombreux systèmes embarqués sont intentionnellement non conformes , donc ils peuvent fournir des définitions alternatives de main ) Mais cela dit, votre signification était claire autrement.


@ DavidC.Rankin merci! C'est toujours une pensée que j'oublie lorsque j'utilise C



0
votes

Si vous pouvez utiliser getopt () ou d'autres fonctions POSIX similaires. Alors voici une façon de procéder:

~ # /tmp/temp_test -?
Usage: bla bla

~ # /tmp/temp_test -y
/tmp/temp_test: invalid option -- 'y'
Usage: bla bla
~ #

Exemple:

#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>

int main(int argc, char** argv)
{
    int opt;

    while ((opt = getopt(argc, argv, "h?")) != -1)
    {
        switch (opt)
        {
        case '?':
        case 'h':
            printf("Usage: bla bla\n");
            break;    
        }
    }

    return EXIT_SUCCESS;
}

Plus d'informations dans page de manuel .


0 commentaires