Arguments pour main en C

Je ne sais pas quoi faire! J’ai une très bonne compréhension des bases du langage C. Structures, fichier IO, chaînes, etc. Tout sauf CLA. Pour une raison quelconque, je ne peux pas saisir le concept. Toute suggestion, aide ou conseil. PS je suis un utilisateur linux

La signature de main est:

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

argc fait référence au nombre d’arguments de ligne de commande transmis, qui inclut le nom réel du programme, invoqué par l’utilisateur. argv contient les arguments réels, en commençant par l’index 1. L’index 0 est le nom du programme.

Donc, si vous avez exécuté votre programme comme ceci:

 ./program hello world 

Alors:

  • argc serait 3.
  • argv [0] serait “./program”.
  • argv [1] serait “bonjour”.
  • argv [2] serait “monde”.

Pour parsingr les arguments de ligne de commande sur les systèmes posix, la norme consiste à utiliser la famille de routines de bibliothèque getopt() pour gérer les arguments de ligne de commande.

Une bonne référence est le manuel GNU getopt

Imaginez-le de cette façon

 *main() is also a function which is called by something else (like another FunctioN) *the arguments to it is decided by the FunctioN *the second argument is an array of ssortingngs *the first argument is a number representing the number of ssortingngs *do something with the ssortingngs 

Peut-être qu’un exemple de programme vous aidera.

 int main(int argc,char *argv[]) { printf("you entered in reverse order:\n"); while(argc--) { printf("%s\n",argv[argc]); } return 0; } 

Il imprime simplement tout ce que vous entrez en tant qu’args dans l’ordre inverse, mais VOUS devriez créer de nouveaux programmes plus utiles.

comstackz-le (comme dit bonjour) lancez-le depuis le terminal avec les arguments comme

 ./hello am i here 

puis essayez de le modifier de sorte qu’il essaie de vérifier si deux chaînes sont inversées ou non, alors vous devrez vérifier si le paramètre argc est exactement trois si quelque chose d’autre affiche une erreur

 if(argc!=3)/*3 because even the executables name ssortingng is on argc*/ { printf("unexpected number of arguments\n"); return -1; } 

puis vérifiez si argv [2] est l’inverse de argv [1] et imprimez le résultat

 ./hello asdf fdsa 

devrait sortir

 they are exact reverses of each other 

le meilleur exemple est un programme de copie de fichiers l’essayer c’est comme cp

fichier cp fichier1

cp est le premier argument (argv [0] pas argv [1]) et la plupart du temps, vous devez ignorer le premier argument sauf si vous devez faire référence ou quelque chose

si vous avez fait le programme cp vous avez compris les arguments principaux vraiment …

Siamore, je continue à voir tout le monde en utilisant la ligne de commande pour comstackr des programmes. J’utilise le terminal x11 de ide via code :: blocks, un compilateur gnu gcc sur mon linux box. Je n’ai jamais compilé de programme en ligne de commande. Donc, si je veux que le nom du programme soit cp, est-ce que j’initialise argv [0] = “cp”; Cp étant un littéral de chaîne. Et tout ce qui va à stdout va sur la ligne de commande ??? L’exemple que tu m’as donné Siamore j’ai compris! Même si la chaîne que vous avez entrée était longue de quelques mots, ce n’était encore qu’un argument. Parce qu’il était entouré de doubles citations. Donc arg [0], le nom de prog, est en fait votre littéral de chaîne avec un nouveau caractère de ligne? Donc, je comprends pourquoi vous utilisez si (argc! = 3) erreur d’impression. Parce que le nom de prog = argv [0] et il y a 2 arguments supplémentaires après cela, et plus une erreur s’est produite. Quelle autre raison utiliserais-je? Je pense vraiment que mon manque de compréhension sur la façon de comstackr à partir de la ligne de commande ou du terminal est la raison de mon manque de compréhension dans ce domaine! Siamore, tu m’as aidé à comprendre que Cla va beaucoup mieux! Je ne comprends toujours pas bien mais je ne suis pas conscient du concept. Je vais apprendre à comstackr à partir du terminal puis relire ce que vous avez écrit. Je parie, alors je comprendrai parfaitement! Avec un peu plus d’aide de ta part lol

<> Code que je n’ai pas écrit moi-même, mais de mon livre.

 #include  int main(int argc, char *argv[]) { int i; printf("The following arguments were passed to main(): "); for(i=1; i 

Ceci est la sortie:

 anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hey man The follow arguments were passed to main(): hey man anthony@anthony:~\Documents/C_Programming/CLA$ ./CLA hi how are you doing? The follow arguments were passed to main(): hi how are you doing? 

Ainsi, argv est une table de littéraux de chaîne et argc est leur nombre. Maintenant, argv [0] est le nom du programme. Donc, si je tape ./CLA pour exécuter le programme ./CLA est argv [0]. Le programme ci-dessus définit la ligne de commande pour prendre une quantité infinie d'arguments. Je peux les configurer pour ne prendre que 3 ou 4 si je le voulais. Comme un ou vos exemples montré, Siamore ... if (argc! = 3) printf ("Some error goes here"); Merci Siamore, tu n'aurais pas pu le faire sans toi! merci aussi au rest du poste pour leur temps et leurs efforts!

PS au cas où il y aurait un problème comme celui-ci dans le futur ... on ne sait jamais lol le problème était parce que j'utilisais le code IDE AKA :: Blocks. Si je devais exécuter ce programme ci-dessus, il imprimerait le chemin / répertoire du programme. Exemple: ~ / Documents / C / CLA.c doit être exécuté à partir du terminal et compilé à l'aide de la ligne de commande. gcc -o CLA main.c et vous devez être dans le répertoire du fichier.

Main est juste comme toute autre fonction et argc et argv sont comme tous les autres arguments de fonction, la différence est que main est appelée depuis C Runtime et elle passe l’argument à main, mais C Runtime est défini dans la bibliothèque c et vous ne pouvez pas le modifier Donc, si nous exécutons un programme sur le shell ou via un IDE, nous avons besoin d’un mécanisme pour passer l’argument à la fonction principale afin que votre fonction principale puisse se comporter différemment sur le runtime en fonction de vos parameters. Les parameters sont argc, qui donne le nombre d’arguments et argv qui est un pointeur vers un tableau de pointeurs, qui contient la valeur sous forme de chaînes, de cette façon vous pouvez transmettre n’importe quel nombre d’arguments sans le restreindre.

Nous avons juste apporté une petite modification au code @anthony afin que nous puissions obtenir une sortie formatée avec des arguments et des valeurs. En quelque sorte plus facile à lire en sortie lorsque vous avez plusieurs arguments:

 #include  int main(int argc, char *argv[]) { printf("The following arguments were passed to main():\n"); printf("argnum \t value \n"); for (int i = 0; i 

Et la sortie est similaire à:

 The following arguments were passed to main(): 0 D:\Projects\test\vcpp\bcppcomp1\Debug\bcppcomp.exe 1 -P 2 TestHostAttoshiba 3 _http._tcp 4 local 5 80 6 MyNewArgument 7 200.124.211.235 8 type=NewHost 9 test=yes 10 result=output