web-dev-qa-db-fra.com

Arguments à main en C

Je ne sais pas quoi faire! J'ai une très bonne compréhension des bases du C Structures, entrées/sorties de fichiers, 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

58
Anthony

La signature de main est:

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

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

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

./program hello world

Ensuite:

  • argc serait 3.
  • argv [0] serait "./programme".
  • argv [1] serait "bonjour".
  • argv [2] serait "monde".
140
cdhowie

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

Une bonne référence est GNU getopt manual

9
Toby

Imaginez ça comme ça

*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 strings

*the first argument is a number representing the number of strings

*do something with the strings

Peut-être un exemple de programme woluld help.

int main(int argc,char *argv[])
{

    printf("you entered in reverse order:\n");

    while(argc--)
    {
        printf("%s\n",argv[argc]);
    }

return 0;
}

il affiche simplement tout ce que vous entrez sous la forme de arguments dans l'ordre inverse, mais VOUS devriez créer de nouveaux programmes plus utiles.

compilez-le (comme bonjour), lancez-le depuis le terminal avec les arguments tels que

./hello am i here

puis essayez de le modifier pour qu'il vérifie si deux chaînes sont inversées ou non, vous devrez vérifier si le paramètre argc est exactement égal à trois si quoi que ce soit d'autre affiche une erreur

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

puis vérifiez si argv [2] est l'inverse de argv [1] et affichez 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, essayez-le comme cp

cp fichier1 fichier2

cp est le premier argument (argv [0] pas argv [1]) et vous devez surtout ignorer le premier argument sauf si vous avez besoin de faire référence ou quelque chose

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

9
Siamore

Siamore, je continue à voir tout le monde utiliser la ligne de commande pour compiler des programmes. J'utilise un terminal x11 depuis ide via code :: blocks, un compilateur gnu gcc sur ma machine linux. Je n'ai jamais compilé un programme en ligne de commande. Donc, Siamore, 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 se passe sur 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, il ne restait qu'un argument. Parce qu'il était entouré de doubles citations. Ainsi, arg [0], le nom de prog, est en réalité votre littéral de chaîne avec un caractère de nouvelle ligne ?? Je comprends donc pourquoi vous utilisez une erreur d’impression si (argc! = 3). Parce que le nom de prog = argv [0] et qu'il y a 2 arguments de plus après cela, et qu'une erreur ne s'est plus produite. Quelle autre raison utiliserais-je? Je pense vraiment que mon manque de compréhension sur la façon de compiler à partir de la ligne de commande ou du terminal est la raison de mon manque de compréhension dans ce domaine! Siamore, vous m'avez aidé à comprendre beaucoup mieux la cla! Je ne comprends toujours pas tout à fait, mais je ne suis pas inconscient du concept. Je vais apprendre à compiler à partir du terminal, puis à relire ce que tu as écrit. Je parie que je comprendrai parfaitement! Avec un peu plus d'aide de vous lol

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

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;

    printf("The following arguments were passed to main(): ");
    for(i=1; i<argc; i++) printf("%s ", argv[i]);
    printf("\n");

    return 0;
} 

C'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 en est le 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 voulais. Comme l'un de vos exemples, Siamore ... if (argc! = 3) printf ("Une erreur se passe ici"); Merci Siamore, je n'aurais pas pu y arriver sans toi! merci au reste du poste pour son temps et ses efforts également!

PS au cas où il y aurait un problème comme celui-ci à l'avenir ... vous ne savez jamais ce problème, c'est que j'utilisais le IDE AKA Code :: Blocks. Si je devais exécuter ce programme Au-dessus, le chemin/répertoire du programme sera imprimé, par exemple: ~/Documents/C/CLA.c, il 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.

8
anthony

Main est comme n'importe quelle autre fonction et argc et argv sont comme n'importe quel autre argument de fonction. La différence est que main est appelé à partir de C Runtime et qu'il passe l'argument à main. Mais C Runtime est défini dans c library et vous ne pouvez pas le modifier. Ainsi, si nous exécutons un programme sur 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 au moment de l’exécution en fonction de vos paramètres. Les paramètres sont argc, qui donne le nombre d'arguments, et argv, pointeur vers un tableau de pointeurs, contient la valeur sous forme de chaînes. Vous pouvez ainsi transmettre n'importe quel nombre d'arguments sans le restreindre. C'est l'autre façon de mettre en oeuvre des arguments.

6
Yusuf Khan

Nous n'avions apporté qu'une petite modification au code @anthony afin que nous puissions obtenir une sortie bien formatée avec des nombres d'arguments et des valeurs. En quelque sorte, plus facile à lire en sortie lorsque vous avez plusieurs arguments:

#include <stdio.h>

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<argc; i++) printf("%d \t %s \n", i, argv[i]);
    printf("\n");

    return 0;
} 

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
3
Nebojsa Tomcic