Io avrei fatto così:
#include <stdio.h>
#include <ctype.h>
/*==============================================================================
Elimina i caratteri spaziatori consecutivamente multipli, facendo inoltre in
modo che la stringa modificata non contenga mai un carattere spaziatore nella
sua prima ne' nella sua ultima posizione. Il puntatore alla stringa originale
puo' coincidere con quello alla stringa modificata. Qualora i due puntatori non
coincidano, lo spazio di memoria puntato da modf deve avere dimensioni
prudenzialmente almeno uguali a quello puntato da orig.
Restituisce la dimensione della nuova stringa così modificata. In caso d'errore,
restituisce il valore massimo rappresentabile per mezzo del tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( const char *orig, char *modf ) {
if( orig && modf ) {
const char *po = orig; // puntatore per scorrere la stringa originale
char *pm = modf; // puntatore per scorrere la stringa modificata
size_t l = 0; // per la lunghezza della stringa risultante
int spazio = 0; // !=0 se si tratta di uno spazio; 0 altrimenti
while( isspace(*po) ) ++po; // eliminiamo gli eventuali spazi iniziali
while( *po ) { // finche' ci sono caratteri nella stringa originale
spazio = isspace( *po ); // il carattere corrente e' uno spazio?
++l; // copia comunque, quindi la stringa modificata si "allunga"
*pm++ = *po++; // spazio o no, copia il carattere corrente
if( spazio ) // se il carattere appena copiato e' uno spazio...
while( isspace(*po) ) // ...e fintanto che ci sono spazi...
++po; // ... passa al carattere successivo
}
if( !spazio ) { // l'ultimo carattere copiato e' uno spazio?
*pm = 'Io avrei fatto così:
#include <stdio.h>
#include <ctype.h>
/*==============================================================================
Elimina i caratteri spaziatori consecutivamente multipli, facendo inoltre in
modo che la stringa modificata non contenga mai un carattere spaziatore nella
sua prima ne' nella sua ultima posizione. Il puntatore alla stringa originale
puo' coincidere con quello alla stringa modificata. Qualora i due puntatori non
coincidano, lo spazio di memoria puntato da modf deve avere dimensioni
prudenzialmente almeno uguali a quello puntato da orig.
Restituisce la dimensione della nuova stringa così modificata. In caso d'errore,
restituisce il valore massimo rappresentabile per mezzo del tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( const char *orig, char *modf ) {
if( orig && modf ) {
const char *po = orig; // puntatore per scorrere la stringa originale
char *pm = modf; // puntatore per scorrere la stringa modificata
size_t l = 0; // per la lunghezza della stringa risultante
int spazio = 0; // !=0 se si tratta di uno spazio; 0 altrimenti
while( isspace(*po) ) ++po; // eliminiamo gli eventuali spazi iniziali
while( *po ) { // finche' ci sono caratteri nella stringa originale
spazio = isspace( *po ); // il carattere corrente e' uno spazio?
++l; // copia comunque, quindi la stringa modificata si "allunga"
*pm++ = *po++; // spazio o no, copia il carattere corrente
if( spazio ) // se il carattere appena copiato e' uno spazio...
while( isspace(*po) ) // ...e fintanto che ci sono spazi...
++po; // ... passa al carattere successivo
}
if( !spazio ) { // l'ultimo carattere copiato e' uno spazio?
*pm = '{parsed_message}'; // se non lo e', "termina" la stringa modificata
}
else { // si', l'ultimo carattere e' uno spazio: eliminiamolo!
--l; // la stringa viene accorciata di un carattere (lo spazio)
*(pm-1) = '{parsed_message}'; // il terminatore viene posto un carattere prima
}
return l; // restituisce la lunghezza della stringa modificata
} else return -1; // essendo size_t senza segno, questo significa
// restituire il valore massimo possibile per size_t
}
int main( void ) {
char src[50] = "Ciao Mondo Bello ";
char dest[50] = "";
size_t dimN = 0;
printf( "\n**** STRINGHE INIZIALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
dimN = EliminaSpaziatureMultiple( src, dest );
printf( "\n\n\n\n**** STRINGHE FINALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
printf( "Lunghezza della stringa finale: %u\n", dimN );
return 0;
}
'; // se non lo e', "termina" la stringa modificata
}
else { // si', l'ultimo carattere e' uno spazio: eliminiamolo!
--l; // la stringa viene accorciata di un carattere (lo spazio)
*(pm-1) = 'Io avrei fatto così:
#include <stdio.h>
#include <ctype.h>
/*==============================================================================
Elimina i caratteri spaziatori consecutivamente multipli, facendo inoltre in
modo che la stringa modificata non contenga mai un carattere spaziatore nella
sua prima ne' nella sua ultima posizione. Il puntatore alla stringa originale
puo' coincidere con quello alla stringa modificata. Qualora i due puntatori non
coincidano, lo spazio di memoria puntato da modf deve avere dimensioni
prudenzialmente almeno uguali a quello puntato da orig.
Restituisce la dimensione della nuova stringa così modificata. In caso d'errore,
restituisce il valore massimo rappresentabile per mezzo del tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( const char *orig, char *modf ) {
if( orig && modf ) {
const char *po = orig; // puntatore per scorrere la stringa originale
char *pm = modf; // puntatore per scorrere la stringa modificata
size_t l = 0; // per la lunghezza della stringa risultante
int spazio = 0; // !=0 se si tratta di uno spazio; 0 altrimenti
while( isspace(*po) ) ++po; // eliminiamo gli eventuali spazi iniziali
while( *po ) { // finche' ci sono caratteri nella stringa originale
spazio = isspace( *po ); // il carattere corrente e' uno spazio?
++l; // copia comunque, quindi la stringa modificata si "allunga"
*pm++ = *po++; // spazio o no, copia il carattere corrente
if( spazio ) // se il carattere appena copiato e' uno spazio...
while( isspace(*po) ) // ...e fintanto che ci sono spazi...
++po; // ... passa al carattere successivo
}
if( !spazio ) { // l'ultimo carattere copiato e' uno spazio?
*pm = '{parsed_message}'; // se non lo e', "termina" la stringa modificata
}
else { // si', l'ultimo carattere e' uno spazio: eliminiamolo!
--l; // la stringa viene accorciata di un carattere (lo spazio)
*(pm-1) = '{parsed_message}'; // il terminatore viene posto un carattere prima
}
return l; // restituisce la lunghezza della stringa modificata
} else return -1; // essendo size_t senza segno, questo significa
// restituire il valore massimo possibile per size_t
}
int main( void ) {
char src[50] = "Ciao Mondo Bello ";
char dest[50] = "";
size_t dimN = 0;
printf( "\n**** STRINGHE INIZIALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
dimN = EliminaSpaziatureMultiple( src, dest );
printf( "\n\n\n\n**** STRINGHE FINALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
printf( "Lunghezza della stringa finale: %u\n", dimN );
return 0;
}
'; // il terminatore viene posto un carattere prima
}
return l; // restituisce la lunghezza della stringa modificata
} else return -1; // essendo size_t senza segno, questo significa
// restituire il valore massimo possibile per size_t
}
int main( void ) {
char src[50] = "Ciao Mondo Bello ";
char dest[50] = "";
size_t dimN = 0;
printf( "\n**** STRINGHE INIZIALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
dimN = EliminaSpaziatureMultiple( src, dest );
printf( "\n\n\n\n**** STRINGHE FINALI ****\n\n" );
printf( "Stringa Iniziale =[%s]\n", src );
printf( "Stringa Finale =[%s]\n", dest );
printf( "Lunghezza della stringa finale: %u\n", dimN );
return 0;
}
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.