8.10. Tratarea parametrilor din linia de comanda

2019/03/19 in Programare in C

In linia de comanda folosita la apelul executiei unui program se pot utiliza diferiti parametri (argumente).

Argumentele sunt succesiuni de caractere separate prin spatii. Ele se tasteaza in linia de comanda prin care se activeaza imaginea executabila (fisierul cu extensia .exe a programului).

Pentru a putea utiliza aceste argumente se vor folosi parametrii argc si argv ai functiei principale. In acest caz, functia principala are antetul:

main( int argc, char *argv[])

Parametrul argc are ca valoare numarul argumentelor din linia de comanda marit cu unu. Parametrul argv este un tablou de pointeri spre zonele in care s-au pastrat argumentele definite ca mai sus.

Argumentele se pastreaza sub forma de siruri de caractere. Pointerul argv[0] este intotdeauna pointerul spre calea fisierului cu imaginea executabila a programului. In continuare, argv[1] este pointerul spre primul argument tastat, argv[2] este pointerul spre al doilea argument s.a.m.d. In general, argv[i] este pointerul spre al i-lea argument tastat.

Daca argumentele in sine contin spatii albe, ele pot fi incluse intre ghilimele ("") sau ghilimele simple ('').

Exemplu:

Presupunem ca la lansarea programului s-au furnizat argumentele:

1 OCTOMBRIE 1993

In cazul acesta parametrii functiei principale au valorile:

argc=4 3 argumente plus specificatorul fisierului cu imaginea executabila a programului;
argv[0] pointer spre specificatorul fisierului cu imaginea executabila a programului (cale, numele si extensia .EXE);
argv[1] pointer spre sirul "1";
argv[2] pointer spre sirul "OCTOMBRIE";
argv[3] pointer spre sirul "1993".

Exercitii:

8.23. Sa se scrie un program care afiseaza parametrii din linia de comanda.

#include <stdio.h>
main( int argc, char *argv[])
/* afiseaza parametrii din linia de comanda */
{
  int i;

  for(i=0; i < argc; i++)
    printf("%s\n", argv[i]);
}

8.24. Sa se scrie un program care afiseaza data calendaristica preluata din linia de comanda sub forma:

zz/ll/aaaa

unde:

zz reprezinta ziua pe 2 cifre;
ll reprezinta numarul lunii pe 2 cifre;
aaaa reprezinta anul pe 4 cifre.

Programul apeleaza functia v_calend pentru a valida data calendaristica preluata din linia de comanda. Intrucat ea se tasteaza sub forma indicata mai sus, aceasta reprezinta un singur argument.

argv[1] este pointerul spre zona in care se pastreaza data calendaristica respectiva.

#include <stdio.h>
#include <stdlib.h>
#include "FUNCTIA092C.C";

int nrzile[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

main( int argc, char *argv[])
/* valideaza si afiseaza data calendaristica/ 
preluata din linia de comanda */
{
  int zz, ll, aaaa;
  char a, b;

  if(argc < 2) {
    printf("lipseste data calendaristica in linia de comanda\n");
    exit(1);
  }
  if(argc > 2) {
    printf("mai mult de un argument in linia de comanda\n");
    exit(1);
  }
  if(sscanf(argv[1], "%2d %c %d %c %4d", &zz, &a, &ll, &b, &aaaa) != 5) {
    printf("argumentul nu are formatul zz/ll/aaaa\n");
    exit(1);
  }
  if(a != '/') {
    printf("dupa zi nu urmeaza caracterul /\n");
    exit(1);
  }
  if(b != '/') {
    printf("dupa luna nu urmeaza caracterul /\n");
    exit(1);
  }
  if(v_calend(zz, ll, aaaa) == 0) {
    printf("data calendaristica eronata\n");
    exit(1);
  }
  printf("%d/%d/%d\n", zz, ll, aaaa);
}

8.11. Pointeri spre functii