Salve, ho creato questa piccola funzione che "dovrebbe" eliminare nelle stringhe i doppi (o tripli ecc.) spazi.
Esempio: CIAO---MON--DO in CIAO-MON-DO (per fare capire meglio ho messo - al posto degli spazi, ma nel programma funziona con gli spazi)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char * doppioSpazio( char *frase )/*Togli i doppi spazi da una stringa*/
{
/* --------------------------- DICHIARAZIONI VARIABILI --------------------------- */
char *appoggio = NULL; /* Stringa di Appoggio */
int controllo = 0;
size_t i = 0 ;
size_t k = 0 ;
size_t count = 0;
size_t dimFrase = strlen( frase );
size_t dimAppoggio = 0;
/* ----------------------- ALLOCAZIONE MEMORIA E CONTROLLO ---------------------- */
appoggio = (char*)calloc( dimFrase , sizeof( char ) );
if( appoggio == NULL ) {
fprintf( stderr , "%s" , "Memoria Finita\n" );
exit( 1 ) ;
}
strcpy( appoggio , frase );
/* ---------------------------------- Do {...}WHILE() ---------------------------- */
do {
/* ------------------------- SCORRE TUTTA LA STRINGA ------------------------- */
for( controllo = 0 , k = 0 , i = 0; i < strlen( appoggio ) ; i++ , k++ ) {
/* -------- CONTROLLA SE L'ELEMENTO ED IL SUCCESSIVO SONO SPAZII --------- */
if( appoggio[i] == ' ' && appoggio[i + 1] == ' ' ) {
/* ---- AUMENTO SOLO UN INDICE PER SLTARE DALLA COPIA UNO SPAZIO ----- */
i++;
controllo = 1;
count++;
}
/* --------------------- FA COMBACIARE GLI ELEMENTI ---------------------- */
appoggio[k] = appoggio[i];
}
/* ----------------------- CHIUDE LA STRINGA CON '\0' ------------------------ */
appoggio[k] = '\0';
/* --- SERVE UN CICLO ITERATIVO PER TOGLIERE EVENTUALI DOPPI SPAZI RESIDUI --- */
} while( controllo );
dimAppoggio = strlen( appoggio ) ;
if( dimFrase == ( dimAppoggio + count ) ) {
/* ---------------------------- COPIO LA STRINGA ----------------------------- */
strcpy( frase , appoggio);
/* ---------------- DEALLOCO LA MEMORIA E AZZERO IL PUNTATORE ---------------- */
//free( appoggio );
//appoggio = NULL;
/* -------------- RESTITUISCO LA NUOVA DIMENSIONE DELLA STRINGA -------------- */
return appoggio;
} else {
/* ---------------- DEALLOCO LA MEMORIA E AZZERO IL PUNTATORE ---------------- */
/* -------------------------- FUNZIONE NON RIUSCITA -------------------------- */
return NULL;
}
}
int main( void )
{
char d[] = "ciao mondo";
char *g ;
printf( "%s\n" , d );
g = doppioSpazio( d );
printf( "\nFrase prima: %s\nFrase Dopo: %s\nFrase Restituita: %s\n" , "ciao mondo" , d, g );
return 0;
}
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char * doppioSpazio( char *frase )/*Togli i doppi spazi da una stringa*/
{
/* --------------------------- DICHIARAZIONI VARIABILI --------------------------- */
char *appoggio = NULL; /* Stringa di Appoggio */
int controllo = 0;
size_t i = 0 ;
size_t k = 0 ;
size_t count = 0;
size_t dimFrase = strlen( frase );
size_t dimAppoggio = 0;
/* ----------------------- ALLOCAZIONE MEMORIA E CONTROLLO ---------------------- */
appoggio = (char*)calloc( dimFrase , sizeof( char ) );
if( appoggio == NULL ) {
fprintf( stderr , "%s" , "Memoria Finita\n" );
exit( 1 ) ;
}
strcpy( appoggio , frase );
/* ---------------------------------- Do {...}WHILE() ---------------------------- */
do {
/* ------------------------- SCORRE TUTTA LA STRINGA ------------------------- */
for( controllo = 0 , k = 0 , i = 0; i < strlen( appoggio ) ; i++ , k++ ) {
/* -------- CONTROLLA SE L'ELEMENTO ED IL SUCCESSIVO SONO SPAZII --------- */
if( appoggio[i] == ' ' && appoggio[i + 1] == ' ' ) {
/* ---- AUMENTO SOLO UN INDICE PER SLTARE DALLA COPIA UNO SPAZIO ----- */
i++;
controllo = 1;
count++;
}
/* --------------------- FA COMBACIARE GLI ELEMENTI ---------------------- */
appoggio[k] = appoggio[i];
}
/* ----------------------- CHIUDE LA STRINGA CON '\0' ------------------------ */
appoggio[k] = '\0';
/* --- SERVE UN CICLO ITERATIVO PER TOGLIERE EVENTUALI DOPPI SPAZI RESIDUI --- */
} while( controllo );
dimAppoggio = strlen( appoggio ) ;
if( dimFrase == ( dimAppoggio + count ) ) {
/* ---------------------------- COPIO LA STRINGA ----------------------------- */
strcpy( frase , appoggio);
/* ---------------- DEALLOCO LA MEMORIA E AZZERO IL PUNTATORE ---------------- */
free( appoggio );
appoggio = NULL;
/* -------------- RESTITUISCO LA NUOVA DIMENSIONE DELLA STRINGA -------------- */
return frase;
} else {
/* ---------------- DEALLOCO LA MEMORIA E AZZERO IL PUNTATORE ---------------- */
/* -------------------------- FUNZIONE NON RIUSCITA -------------------------- */
return NULL;
}
}
int main( void )
{
char d[] = "ciao mondo";
char *g ;
printf( "%s\n" , d );
g = doppioSpazio( d );
printf( "\nFrase prima: %s\nFrase Dopo: %s\nFrase Restituita: %s\n" , "ciao mondo" , d, g );
return 0;
}
Lasciando stare l'algoritmo usato, identazione e stile commenti (ma comunque consigli su di essi sono ben accetti)
Il 1° programma funziona in VS2015, Eclipse e Dev-c++ , il secondo invece solo in Eclipse e Dev-c++. Se uso VS2015 (controllandolo via Debug) mi da errore nell'istruzione free() se la ometto, tutto funziona. qualcuno ha consigli in merito?