Buongiorno,
ho un dubbio che spero qualcuno mi possa chiarire: per esercizio devo modificare l'ordine in cui delle stringhe compaiono in un array frastagliato, secondo certi criteri.
Finché ho stringhe di uguale lunghezza tutto ok, nessun problema, ma quando vado a mettere nell'array stringhe di lunghezza diversa giustamente se scambio una stringa con una più lunga questa va a sovrascrivere pezzi di altre stringhe.
La mia domanda è: c'è modo di modificare l'ordine di stringhe di lunghezza diversa senza dover copiare tutto in un altro array? (siccome devo lavorare su stringhe passate da standard input l'array è allocato automaticamente e la funzione realloc non funziona).
I prototipi delle funzioni mi sono dati dall'esercizio e non li posso modificare.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define N 100
void treVolte( char *a[], int n ) {
char **p;
int conta = 0;
char *q = malloc(sizeof(a[0]));
if(q == NULL) {
printf("Errore");
return;
}
for ( p = a; p < a + n; p++ ) {//conta le stringhe
int contae = 0;
char *c;
c = *p;
while ( *c ) {//finche il carattere è diverso da \0
if ( *c == 'e' ) {
contae++;
}
c++;//scorro i caratteri della stringa
}
if ( contae >= 3 ) {
conta++;
}
if ( conta == 3 ) {
strcpy(q, a[0]);
strcpy(a[0], *p);
strcpy(*p, q);
free(q);
return;
}
}
}
int main( int argc, char **argv ) {
treVolte( argv + 1, argc-1);
for ( char** p = argv+1; p < argv+argc; p++ )
printf( "%s ", *p );
printf( "\n" );
return 0;
}
Passando per esempio le stringhe:
certamentissimamente signora non vorrei essere scortese posso ripetere le istruzioni
dovrei visualizzare
ripetere signora non vorrei essere scortese posso certamentissimamente le istruzioni
e invece visualizzo
ripetere signora non vorrei essere scortese posso certamentissimamente
issimamente imamente
perché giustamente l'array ha ancora in memoria i puntatori vecchi.
Il programma deve scambiare la terza parola con tre 'e' con la prima, come avrete capito.
Grazie