Line 1: | Line 1: | ||
Este exemplo faz uso de uma [[Pilha (dimensão variável)|pilha de strings de dimensão variável]] para armazenar dados lidos da linha de comando. | Este exemplo faz uso de uma [[Pilha (dimensão variável)|pilha de strings de dimensão variável]] para armazenar dados lidos da linha de comando. | ||
+ | |||
+ | == Ficheiro main.c == | ||
+ | |||
+ | void processa_linha_de_comandos(int argc, char **argv, struct pilha *p) { | ||
+ | unsigned ax; | ||
+ | unsigned char falhei = 0; | ||
+ | printf("Há %d argumentos na linha de comandos...\n", argc-1); | ||
+ | |||
+ | for (ax = 1; ax < argc; ax++) { | ||
+ | char *arg = argv[ax]; | ||
+ | printf("Vou guardar o %dº argumento: %s... \t", ax, arg); | ||
+ | |||
+ | if (push(p, arg) != FALHA) printf("consegui!!\n"); | ||
+ | else { | ||
+ | printf("falhei! Vou ignorar os restantes %d argumentos.\n", argc - ax); | ||
+ | falhei = 1; | ||
+ | break; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | if (!falhei) | ||
+ | printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", tamanho(p)); | ||
+ | else | ||
+ | printf("Não consegui guardar a partir do %dº argumento (%s).\n", ax, argv[ax]); | ||
+ | } | ||
+ | |||
+ | Note-se a libertação de memória (reserva efectuada em <code>[[Pilha (dimensão variável)|push]]</code>). | ||
+ | |||
+ | int main(int argc, char *argv[]) { | ||
+ | char *ptr = NULL; | ||
+ | |||
+ | struct pilha p; | ||
+ | inicia(&p); | ||
+ | |||
+ | printf("Sou %s, uma pilha de 'strings'.\n", argv[0]); | ||
+ | processa_linha_de_comandos(argc, argv, &p); | ||
+ | |||
+ | while ((ptr = pop(&p))) { | ||
+ | printf("Li da pilha: %s\n", ptr); | ||
+ | '''free'''(ptr); /* libertar memória (malloc em push) */ | ||
+ | } | ||
+ | |||
+ | printf("Hmm! Li tudo: a pilha ficou com %d elementos.\n", tamanho(&p)); | ||
+ | return 147; | ||
+ | } | ||
== Ver Também == | == Ver Também == | ||
* [[Gestão de Memória (exemplo com pilha)]] | * [[Gestão de Memória (exemplo com pilha)]] |
Este exemplo faz uso de uma pilha de strings de dimensão variável para armazenar dados lidos da linha de comando.
void processa_linha_de_comandos(int argc, char **argv, struct pilha *p) { unsigned ax; unsigned char falhei = 0; printf("Há %d argumentos na linha de comandos...\n", argc-1); for (ax = 1; ax < argc; ax++) { char *arg = argv[ax]; printf("Vou guardar o %dº argumento: %s... \t", ax, arg); if (push(p, arg) != FALHA) printf("consegui!!\n"); else { printf("falhei! Vou ignorar os restantes %d argumentos.\n", argc - ax); falhei = 1; break; } } if (!falhei) printf("Uff! Guardei tudo: a pilha tem %d elementos.\n", tamanho(p)); else printf("Não consegui guardar a partir do %dº argumento (%s).\n", ax, argv[ax]); }
Note-se a libertação de memória (reserva efectuada em push
).
int main(int argc, char *argv[]) { char *ptr = NULL; struct pilha p; inicia(&p); printf("Sou %s, uma pilha de 'strings'.\n", argv[0]); processa_linha_de_comandos(argc, argv, &p); while ((ptr = pop(&p))) { printf("Li da pilha: %s\n", ptr); free(ptr); /* libertar memória (malloc em push) */ } printf("Hmm! Li tudo: a pilha ficou com %d elementos.\n", tamanho(&p)); return 147; }