Esercizio 1, prova pratica 12/02/2009
Revision as of 19:38, 26 November 2014 by Davide.boldrin (talk | contribs)
Ho provato a svolgere l'esercizio 1 dell'esame di laboratorio del 2 febbraio 2009 ([1]).
Consegna:
Esercizio1 (obbligatorio): (10 punti)
Scrivere un programma C denominato “invarg” che esegua il programma passato come parametro invertendo gli argomenti.
Esempio:
invarg cat a b c
deve avere l'effetto di
cat c b a
Soluzione di Maldus
#include <stdio.h>
#include <stdlib.h>
int main(int argc , char* argv[]){
char *nargv[argc-1] ; /*nargv è il vettore degli argomenti da passare al programma da eseguire*/
int i , j ; /*puntatori che scorrono, rispettivamente, argv ed nargv per riempire correttamente nargv*/
nargv[0] = argv[1] ; /*il primo valore di nargv deve essere il programma chiamato, l'ultimo deve essere NULL*/
nargv[argc-1] = NULL ;
for( i = argc - 1 , j = 1 ; i > 1 , j < (argc - 1) ; i-- , j++ ) nargv[j] = argv[i] ; /*metto in nargv (dal secondo elemento in poi) gli argomenti presenti
in argv in ordine invertito*/
execvp( nargv[0] , nargv ) ; /*eseguo il programma (il cui nome è contenuto in nargv[0]) passandogli nargv come vettore di parametri*/
fprintf( stderr , "programma errato\n" ) ; /*se ci troviamo in questo punto significa che la chiamata a execvp è fallita, probabilmente
perchè il programma indicato non è stato trovato*/
exit(1) ;
}
Soluzione di Eddy
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
void scambia_ordine(int argc, char **argv, int j);
int main(int argc , char* argv[])
{
if (argc < 2) return 2;
argv++; argc--;
scambia_ordine(argc, argv, 1);
execvp(argv[0], argv);
perror("execvp");
return 3;
}
/* piccola funzione ricorsiva che:
* -memorizza in tmp gli argomenti dalla fine
* -assegna ad argv in ordine inverso
*
* non scambia il primo argomento
*/
void scambia_ordine(int argc, char **argv, int j)
{
char *tmp;
if (argc > 1){
tmp = argv[argc-1];
scambia_ordine (argc-1, argv, j+1);
argv[j]=tmp;
}
}
Eddy (talk) 21:00 Saturday, 22 November 2014 (CET)
Soluzione di GFede
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
void scambia(int offset, int argc, char* argv[]);
int main(int argc, char* argv[])
{
if(argc <= 1)
{
printf("Usage: invarg.exe command [arguments...]\n");
return 2;
}
scambia(2, argc - 1, argv);
execvp(argv[1], argv + 1);
perror("execvp");
return 1;
}
/**
* Scambia le stringhe all'interno dell'array
* void scambia
* int offset Indice da cui iniziare a scambiare
* int argc Numero di valori nell'array (Compreso l'offset)
* char* argv[] array di stringhe da scambiare
*/
void scambia(int offset, int argc, char* argv[])
{
int i;
char* tmp;
for( i = offset; i < argc - i + offset; i++ )
{
tmp = argv[i];
argv[i] = argv[argc - i + offset];
argv[argc - i + offset] = tmp;
}
}
Soluzione di LorenzoV
#include <stdlib.h>
#include <stdio.h>
void swap(char **p, char **q){ // La swap modifica solo i puntatori
char *tmp;
tmp=*p;
*p=*q;
*q=tmp;
}
int main(int argc, char* argv[]){
char **begin, **end;
if (argc<3){
fprintf(stderr, "Usage:\n\t%s command ...arguments...\n", argv[0]);
exit(1);
}
begin=argv+2;
end=argv+argc-1;
while (begin<end){ // Inverte i parametri passati al comando
swap(begin, end);
begin++;
end--;
}
execvp(argv[1], argv+1);
return 0;
}
--LorenzoV (talk) 18:35, 25 November 2014 (CET)
Soluzione di BoldrinD
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
void invarg(int Qparametri, char* Rargv[], char* argv[]);
int main(int argc, char* argv[]){
int Qparametri=argc-1;
char *Rargv[Qparametri];
invarg(Qparametri, Rargv, argv);
printf("%s\n","il nuovo vettore dei parametri è stato creato con successo");
execvp(Rargv[0], Rargv);
perror("execvp");
return 1;
}
void invarg(int Qparametri, char* Rargv[], char* argv[]){
Rargv[0]=argv[1];
Rargv[Qparametri]=NULL;
int i=2;
while(argv[i]!=NULL){
Rargv[Qparametri-1]=(argv[i]);
i++;
Qparametri--;
}
}