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 -?
4 Réponses :
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]);
}
}
É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.
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 à "-?"
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.
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.
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]);
}
}
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
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 .