Vi chiedo un giudizio veloce su come ho svolto questo esercizio:
Esercizio 1.19 Scrivete una funzione reverse(s), che inverta la stringa di caratteri s.
Usatela per scrivere un programma che inverta, una per volta, le sue linee di input.
Io ho fatto in questo modo:
/* Registra tutto l'input fino a EOF nel vettore input (in main)
Taglia la prima stringa del vettore input e la trasferisce nel vettore scambio.
Reverse inverte il contenuto del vettore scambio trasferendolo nel vettore output
Stampa il vettore output
Shift del vettore input (per cancellare la stringa appena stampata)
Azzera i vettori scambio e output
Ricomincia dal punto 2
Il codice che ho scritto funziona bene ma ho l'impressione che la soluzione da me adottata sia troppo complicata per un esercizio cosí semplice. Che ne pensate?
/* Esercizio 1.19 Scrivete una funzione reverse(s), che inverta la stringa di caratteri s.
Usatela per scrivere un programma che inverta, una per volta, le sue linee di input. */
/* Registra tutto l'input fino a EOF nel vettore input (in main)
Taglia la prima stringa del vettore input e la trasferisce nel vettore scambio.
Reverse inverte il contenuto del vettore scambio traserendolo nel vettore output
Stampa il vettore output
Shift del vettore input
Azzera i vettori scambio e output
Ricomincia dal punto 2 */
#include <stdio.h>
#define MAXINPUT 1000000
void azzeravett(char vettore[], int lunghezzavettore);
int tagliastr(char from[], char to[]);
void shift(char vettore[], int inizio, int lunghezzavettore);
void reverse(char dritto[], char inverso[], int lunghezzastringa);
void stampa(char vettore[]);
char input[MAXINPUT];
char scambio[MAXINPUT];
char output[MAXINPUT];
int finestr; // indica il numero di caratteri della striga da stampare
int main()
{
/* Azzera variabili e vettori */
azzeravett(input, MAXINPUT);
azzeravett(scambio, MAXINPUT);
azzeravett(output, MAXINPUT);
int finestr=0; // numero di caratteri della stringa in lavorazione
int c=0;
int endinput=0; // numero di caratteri di tutto l'input
/* Registra tutto l'input nel vettore input */
while((c=getchar())!=EOF)
{
input[endinput]=c;
++endinput;
}
/* Se l'input non finisce con new line aggiungi '\n' */
if(input[endinput-1]!='\n')
input[endinput]='\n';
putchar('\n');
/* Loop che formatta e stampa l'input.
Il ciclo si interrompe quando l'input e' una linea vuota */
while((finestr=tagliastr(input, scambio))!=0)
{
reverse(scambio, output, finestr);
stampa(output);
shift(input, finestr, MAXINPUT);
azzeravett(output, MAXINPUT);
azzeravett(scambio, MAXINPUT);
}
return 0;
}
/* azzerra un vettore */
void azzeravett(char vett[], int stop)
{
for(int i=0; i<=stop; ++i)
vett[i]=0;
}
/* taglia la prima stringa di un vettore e la trasferisce in un vettore scambio. Restituisce la
lunghezza della stringa, restituisce 0 se il primo carattere incontrato e' '\0' */
int tagliastr(char from[], char to[])
{
int c=0;
int i=0;
c=from[i];
switch(c)
{
case '\0' :
return i;
break;
default :
while((c=from[i])!='\n')
{
to[i]=c;
++i;
}
to[i]='\n';
return i;
break;
}
}
/* trasferisce la stringa dal vettore scambio a quello di output, invertendola */
void reverse(char dritto[], char inverso[], int stop)
{
int contatore;
contatore=stop-1;
int i=0;
for(i=0; i<stop; ++i)
{
inverso[i]=dritto[contatore];
--contatore;
}
inverso[stop]='\n';
inverso[stop+1]='\0';
}
/* stampa la stringa nel vettore output */
void stampa(char vett[])
{
printf("%s", vett);
}
/* shift del vettore di input per eliminare la stringa appena stampata */
void shift(char vett[], int inizio, int fine)
{
int i=0;
for(i=0; i<=fine; ++i)
{
vett[i]=vett[inizio+1];
++inizio;
}
}