Ah, be'... se come dice Lumo si intende fare una modifica sul posto, la mia versione è facilissimamente adattabile.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*==============================================================================
Elimina "sul posto" 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.
Restituisce la dimensione della stringa modificata.
In caso d'errore, restituisce il valore massimo rappresentabile per mezzo del
tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // 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 = 'Ah, be'... se come dice Lumo si intende fare una modifica sul posto, la mia versione è facilissimamente adattabile.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*==============================================================================
Elimina "sul posto" 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.
Restituisce la dimensione della stringa modificata.
In caso d'errore, restituisce il valore massimo rappresentabile per mezzo del
tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // 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 str[50] = "Ciao Mondo Bello ";
size_t dimN = 0;
printf( "Stringa originale = [%s]\n", str );
printf( "Lunghezza della stringa originale: %u\n\n", strlen(str) );
dimN = EliminaSpaziatureMultiple( str );
printf( "Stringa Modificata = [%s]\n", str );
printf( "Lunghezza della stringa modificata: %u\n\n", dimN );
return 0;
}
L'unica differenza è che si impostano sia po sia pm sullo stesso valore iniziale, ovvero l'indirizzo dell'unico parametro str.
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // puntatore per scorrere la stringa modificata
// il resto della funzione e' identico alla versione con due parametri
}
Ovviamente, anche il modo in cui si usa la funzione deve cambiare (vedi il main del primo listato).
'; // 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) = 'Ah, be'... se come dice Lumo si intende fare una modifica sul posto, la mia versione è facilissimamente adattabile.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
/*==============================================================================
Elimina "sul posto" 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.
Restituisce la dimensione della stringa modificata.
In caso d'errore, restituisce il valore massimo rappresentabile per mezzo del
tipo size_t.
==============================================================================*/
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // 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 str[50] = "Ciao Mondo Bello ";
size_t dimN = 0;
printf( "Stringa originale = [%s]\n", str );
printf( "Lunghezza della stringa originale: %u\n\n", strlen(str) );
dimN = EliminaSpaziatureMultiple( str );
printf( "Stringa Modificata = [%s]\n", str );
printf( "Lunghezza della stringa modificata: %u\n\n", dimN );
return 0;
}
L'unica differenza è che si impostano sia po sia pm sullo stesso valore iniziale, ovvero l'indirizzo dell'unico parametro str.
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // puntatore per scorrere la stringa modificata
// il resto della funzione e' identico alla versione con due parametri
}
Ovviamente, anche il modo in cui si usa la funzione deve cambiare (vedi il main del primo listato).
'; // 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 str[50] = "Ciao Mondo Bello ";
size_t dimN = 0;
printf( "Stringa originale = [%s]\n", str );
printf( "Lunghezza della stringa originale: %u\n\n", strlen(str) );
dimN = EliminaSpaziatureMultiple( str );
printf( "Stringa Modificata = [%s]\n", str );
printf( "Lunghezza della stringa modificata: %u\n\n", dimN );
return 0;
}
L'unica differenza è che si impostano sia po sia pm sullo stesso valore iniziale, ovvero l'indirizzo dell'unico parametro str.
size_t EliminaSpaziatureMultiple( char *str ) {
if( str ) {
char *po = str; // puntatore per scorrere la stringa originale
char *pm = str; // puntatore per scorrere la stringa modificata
// il resto della funzione e' identico alla versione con due parametri
}
Ovviamente, anche il modo in cui si usa la funzione deve cambiare (vedi il main del primo listato).
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.