CATEGORII DOCUMENTE |
DOCUMENTE SIMILARE |
|
TERMENI importanti pentru acest document |
|
Argumentele liniei de comanda
Printre facilitatile oferite de C exista modalitatea de a transmi-
te argumentele liniei de comanda sau parametrii unui program
atunci cind el incepe sa se execute. Pt inceperea executiei este
apelat main prin doua argumente. Primul (numit convetional arge)
este numarul argumentelor liniei de comanda prin care a fost
apelat programul; al doilea (argv) este un pointer pe un tablou de
lanturi de caractere care contine argumentele, unul pentru
fiecare lant. Manipularea acestor lanturi de caractere este o
utilizare comuna a nivelelor multiple de pointeri.
Cea mai simpla ilustrare a declaratiilor necesare si a celor
de mai sus amintite este programul echo, care pune pur si
simplu pe o singura linie argumentele liniei de comanda, separate
prin blancuri. Astfel, daca este data comanda
echo hello, world
iesirea este
hello, world
Prin conventie, argv[0] este numele prin care se recunoaste
programul, asa ca argc este 1. In exemplul de mai sus, argc este 3
si argv[0], argv[1] si argv[2] sint respectiv echo, hello si
world. Aceasta este ilustrata in echo:
main(argc, argv) /* arg. echo; prima versiune */
int argc;
char *argv[];
Daca argv este un pointer pe inceputul tabloului care
contine siruri de argumente, a-l incrementa cu i(++argv) face ca
el sa pointeze pe argv[1] in loc de argv[0]. Fiecare incrementare
succesiva muta pe argv pe urmatorul argument; argv este deci
pointerul pe acel argument. Simultan argc este decrementat;
atunci cind el devine zero, nu mai exista argumente de imprimat.
main(argc, ragv) /* arg echo; a treia versiune */
int argc;
char *argv[];
Aceasta versiune arata ca formatul argumentului lui printf poate
fi o expresie ca oricare alta. Aceasta utilizare nu este foarte
frecventa dar este bine sa fie retinuta.
Ca un al doilea exemplu, sa facem unele modificari in confi-
guratia programului de cautare din cap4. In cazul unui apel repe-
tat, configuratia ce serveste de model va fi prelucrata ca atare,
de fiecare data de catre program, ceea ce ar duce la un aranjament
evident nesatisfacator. Urmind exemplul utilitarului grep-UNIX, sa
schimbam programul in asa fel incit configuratia model sa fie
specificata prin primul argument al liniei de comanda.
#define MAXLINE 1000
main(argc, argv)
/* cautarea model specificat prin primul argument*/
int argc;
char *argv[];
Acum poate fi elaborat modelul de baza in asa fel incit sa ilus-
treze viitoarele constructii realizate cu ajutorul pointerilor.
Sa presupunem ca dorim ca doua argumente sa fie optionale. Unul
dintre ele spune 'tipareste toate liniile cu exceptia celor care
contin modelul '; al doilea cere 'fiecare linie tiparita sa fie
precedata de numarul curent'.
O conventie uzuala pt programele C este legata de argumentul
care incepe cu un semn minus si care introduce un flag sau un
paramentru optional. Daca se alege -x(pt 'exceptie') pt semnalarea
inversarii, si ('nr') pt a cere numararea liniilor, atunci
comanda
find -x -n the
cu intrarea
now is the time
for all good men
to come to the aid
of their party
va produce iesirea
2: for all good men
Argumentele optionale sint admise in orice ordine iar restul
programului va fi insensibil la numarul argumentelor care au fost,
de fapt, prezente. In particular, apelul la index nu va referi pe
argv[2] atunci cind a fost un singur flag si nici la argv[1] daca
n-a existat nici un argument flag. In plus, este convenabil pt
utilizatori daca argumentele optionale pot fi adunate, ca in
find -nx the
Iata programul
#define MAXLINE 1000
main(argc, argv) /*gasirea configuratiei din primul arg*/
int argc;
char *arv[];
, *s;
long lineno = 0;
int except = 0, number = 0;
while (--argc > 0 && (*++argv)[0] == '-')
for (s = argv[0] + 1; *s != '0'; s++)
switch (*s)
if (argc != 1)
printf('usage: find -x -n patternn');
else
while (getline(lim, MAXLINE) > 0)
}
}
argv este incrementat inaintea fiecarui argument optional si argc
este decrementat. Daca nu exista erori, la sfirsitul buclei argc
va fi 1 iar argv va pointa pe configuratia data. De notat ca
*++argv este un pointer pe un lant de caractere; (*++argv)[0]
este primul caracter. Parantezele sint necesare deoarece fara
de expresia ar fi *++(argv[0]), ceea ce este cu totul altceva (si
eronat). O forma corecta ar fi.
**++argv
Exercitiul 5.7. Scrieti programul add care evalueaza o
expresie poloneza inversata din linia de comanda. De exemplu,
add 2 3 4 + *
calculeaza 2 x (3 + 4)
Exercitiul 5.8. Modificati programele entab si detab (scrise ca
exercitii in cap 1) in asa fel incit sa accepte ca argumente o
lista de tab-stop-uri utilizati tab-urile normale daca nu exista
argumente.
Exercitiul 5.9. Extindeti entab si dentab in asa fel incit sa
accepte prescurtarea.
entab m +n
care inseamna tab-stop dupa fiecare n coloane, incepind de la
coloana m. Scrieti functia oarecare implicita convenabila pentru
utilizator.
Exercitiul 5.10. Scrieti programul tail care tipareste rutinele
n linii-input. Presupunem, implicit n=10, dar el poate fi
schimbat un argument optional, astfel
tail -n
imprima ultimele n linii. In mod normal, programul va functiona
indiferent de intrare (rationala sau nu), sau de valoare lui n.
Scrieti progarmul in asa fel incit sa utilizeze in mod optim
memoria: liniile vor fi pastrate ca in short, nu intr-un tablou
bidimensional de lungime fixata.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 959
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved