Sie sind auf Seite 1von 5

!"#$% "'()*+,-".

/% 0 1*)2*,++,-")' %' 3



4% 1*)-)-51% 6% 7, ()'#-")' +,"'89

1. Intiouuction..................................................................................................................................................................1
2. Paiameties et type ue ietoui ue la fonction main()....................................................................................1
3. Exemple 1.......................................................................................................................................................................2
4. La fonction exit() uu C..............................................................................................................................................2
5. Btectei le coue ue ietoui u'un piogiamme uepuis le Teiminal ..........................................................S
6. !"#$%&' ues paiameties et exemple 2................................................................................................................S

1. !"#$%&'(#)%"
Poui lancei une commanue uans le Teiminal, vous tapez le nom ue la commanue suivi ue ses
aiguments - ou paiameties. Loisqu'on lance un piogiamme ciit en C uepuis le Teiminal, on
peut ue la mme manieie fouinii ues aiguments au piogiamme, pai exemple en tapant :
$ ./monProgramme coucou 233 -c
Nais comment icupiei ces aiguments uans le piogiamme C lui mme .
*+ ,-$-./#$01 0# #340 &0 $0#%'$ &0 5- 6%"(#)%" .-)"78
La fonction main() u'un piogiamme C est la piemieie fonction excute lois uu lancement uu
piogiamme. Le langage C spcifie un piototype complet poui la fonction main() (paiameties et
un type ue ietoui) qui, justement, peimet au piogiamme ue icupiei ses paiameties.
Le piototype complet ue la fonction main() u'un piogiamme C est :
int main(int argc, char *argv[]) ;
o :
- int argc est le nombie ue paiameties effectivement pass au piogiamme. Ce nombie
est toujouis > 1 cai le piemiei paiametie est toujouis le nom ue l'excutable.
- char * argv [] est un tableau ue chaine ue caiacteies contenant les paiameties
effectivement passs au piogiamme.

Le piemiei lment ue ce tableau (argv[0]) contient toujouis le nom uu piogiamme (ou plus
picisment le chemin utilis poui accuei au fichiei excutable). C'est bien utile cai on ne sait
pas, uans le coue C, comment le fichiei excutable s'appelle : ce fichiei excutable a pu tie
ienomm pai exemple apies avoii t compil !
Le i
eme
lment uu tableau, argv[i], est une chaine qui contient le i
eme
paiametie pass au
piogiamme.

Pai ailleuis, confoimment au piototype ue la fonction main(), un piogiamme C uoit ietouinei
(return) loisqu'il se teimine coue ue ietoui entiei. Ce coue ue ietoui peimet au
piogiamme ue faiie savoii au systeme si une eiieui a t utecte.
0n ietienuia que, pai convention :
- le main() uoit ietouinei u (ou la constante EXIT_SUCCESS, ufinie uans stdlib.h,
qui vaut u) si tout s'est bien pass
- le main() uoit ietouinei un nombie ')' '/7 en cas u'eiieui.
!"#$% "'()*+,-"./% 0 1*)2*,++,-")' %' 3



Le choix u'une valeui quelconque non nulle en cas u'eiieui peimet votie piogiamme ue savoii
quel est le type u'eiieui, en associant une valeui entieie une eiieui uonne. La constante
EXIT_FAILURE, ufinie uans stdlib.h, non nulle, peimet ue ietouinei un coue u'eiieui pai
ufaut si on a pas besoin ue valeuis spciales.
Toutefois, les coues ue ietoui compiis entie 126 et 2SS sont iseivs pai le systeme poui ues
eiieuis spciales. Pai exemple, un coue ue ietoui valant 1S9 signifie qu'une $(')(&*"*%+&
-"./* (eiieui u'acces mmoiie) a eu lieu uans le piogiamme et que le piogiamme a plant.
3. 9:0.450 ;
Le programme simple suivant affiche les paramtres qui lui sont passs depuis le Terminal :
//prg.c
int main ( int argc , char * argv[] ) {
int i;
// affichage des arguments
printf("Nombre darguments passes au programme : %d\n",
argc);
for(i = 0 ; i< argc ; i ++) {
printf(" argv[%d] : %s\n", i, argv[i]);
}
return 0 ;
}
0ne fois ce piogiamme compil, si l'utilisateui le lance uepuis le Teiminal en tapant :
$ ./prg.exe test.txt 2
alois le piogiamme afficheia uans le Teiminal :
Nombre darguments passes au programme : 3
argv[0] : .pig.exe'
argv[1] : test.txt'
argv[2] : 2'
puis ietouineia u (tout s'est bien pass).
4. <- 6%"(#)%" 0:)#78 &' =
En C, la fonction exit(int status) permet de terminer le programme en retournant le code erreur status.
Voir man exit S3

Ainsi, ou que lon soit dans la code, on peut utiliser exit() pour arrter le programme. Par exemple :
long fact( long n) {
if( n < 0 ) {
exit( EXIT_FAILURE) ;
}
//
}
!"#$% "'()*+,-"./% 0 1*)2*,++,-")' %' 3



5. >?#0(#0$ 50 (%&0 &0 $0#%'$ &@'" 4$%A$-..0 &04')1 50 B0$.)"-5
Pour information, puisquun programme C retourne un code erreur, le Terminal est bien sur arm pour
traiter ce code erreur. Il suffit de savoir deux choses :
La commande echo du Terminal permet dafficher une chaine de caractre. Par exemple
echo toto affiche toto.
A tout instant, la variable $? contient toujours la valeur de retour du dernier programme
excut

Ainsi, si on tente de supprimer un fichier toto qui nexiste pas avec rm, rm affiche un message derreur
et retourne bien un code erreur non nul :
$ rm toto
rm: toto: No such file or directory
$ echo $?
1
C+ !"#$%&' &01 4-$-./#$01 0# 0:0.450 *
0n piogiamme commence pai analysei (ou 0"#$(# ) les paiameties poui 1 viifiei qu'ils
iespectent bien ce qui est attenuu (qu'on a pass un entiei si on attenu un entiei pai exemple) et
2 initialisei ses vaiiables. L'exemple suivant piopose une stiuctuie poui se faiie, qui est ties
couiante et que vous pouiiez iutilisei.

Supposons qu'on veuille ciiie un piogiamme qui affiche plusieuis fois uans le Teiminal le
contenu u'un fichiei, texte ou binaiie uont le chemin est pass en paiametie.
Le foimat qu'on ietient poui les paiameties passei au piogiamme est uonc :
Piemiei paiametie : option -txt ou -bin
Seconu paiametie : nom uu fichiei, chaine ue caiacteie
Tioisieme paiametie : entiei, optionnel

Le piogiamme suivant analyse ces paiameties :
!"#$% "'()*+,-"./% 0 1*)2*,++,-")' %' 3



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

// Affiche l'aide du programme
void printHelp(char * prgName) {
printf("%s\n", prgName);
printf(" Displays the content of a txt or binary file\n");
printf(" Usage:\n");
printf(" %s <opt> <fileName> (<nb>)\n", prgName);
printf(" where:\n");
printf(" <opt> is either '-txt' or '-bin' (txt or bin file).\n");
printf(" <fileName> is the name of the file to display.\n");
printf(" <nb> is the number of display to achieve.\n
printf(" Optinal, default 1.\n");
}

// Affiche l'erreur errStr, puis l'aide du programme
void printError(char * prgName, char * errStr) {
printf("Error : '%s'\n", errStr);
printHelp(prgName);
}



int main(int argc, char *argv[])
{
int mode ; // 0 => txt ; 1 => binary
char *fileName = NULL;
FILE * filePtr = NULL;
int nbDisplay = 1;
int i;

///////
// parsing des arguments
///////
if(argc < 3 || argc > 4) {
printError( argv[0], "number of args invalid" );
return EXIT_FAILURE;
}

// affichage aide
if( strcmp(argv[1], "-h") == 0 || strcmp(argv[1], "-help") == 0) {
printHelp(argv[0]);
return EXIT_SUCCESS;
}

// type de fichier
if( strcmp(argv[1], "-txt") == 0) {
mode = 0;
} else if( strcmp(argv[1], "-bin") == 0) {
mode = 1;
} else {
printError( argv[0], "-txt or -bin required" );
exit(EXIT_FAILURE); // equivalent a return EXIT_FAILURE;
}


// nom du fichier
fileName = argv[2];

!"#$% "'()*+,-"./% 0 1*)2*,++,-")' %' 3



// entier
if(argc == 4) {
// on attend un entier !
if( sscanf(argv[3], "%d", &nbDisplay) != 1) {
printError( argv[0], "Integer awaited" );
exit(EXIT_FAILURE); // equivalent a return EXIT_FAILURE;
}
}

///////
// c'est parti !
///////

switch(mode) {
case 0:
filePtr = fopen (fileName, "rt");
break;
case 1:
filePtr = fopen (fileName, "rt");
break;
}

if(filePtr == NULL) {
printError( argv[0], "Cannot open file" );
exit(EXIT_FAILURE); // equivalent a return EXIT_FAILURE;
}

for(i = 0 ; i < nbDisplay ; i ++) {
switch(mode) {
case 0:
// displayTxtFile(filePtr);
// fct supposee existante
break;
case 1:
// displayBinFile(filePtr);
// fct supposee existante
break;
}
}
fclose(filePtr);

return EXIT_SUCCESS;
}



Poui infoimation, la fonction getopt() (voii man getopt S3) ufinie uans unistd.h
peut aiuei l'analyse ues paiameties u'un piogiamme.

Das könnte Ihnen auch gefallen