DOMANDA Eliminare gli spazi da una frase con programma in C

Pubblicità

dalca

Nuovo Utente
Messaggi
20
Reazioni
3
Punteggio
4
Buonasera a tutti,
sto cercando, per esercizio, di fare un programma che immessa una frase, mi ritorna la stessa frase senza gli spazi.
Il listato di quanto sono riuscito a fare è il seguente:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

int main(void) {
    char frase[MAX] = "Frase di prova del programma";
    char modificata[MAX];
    
    int i;
        for(i = 0; frase[i] != '\0'; i++) {
        if(!isspace(frase[i])) {
            modificata[i] = frase[i];
        }
        else {
            modificata[i] = frase[i + 1];
        }
    
    }
    
    printf("\n\nLa frase modificata è: %s", modificata);
    
    exit(0);
}

Il problema è che mi raddoppia tutte le lettere iniziali delle parole.

Qualcuno può indicarmi come risolvere?

Grazie
 
Ciao, la stringa senza spazi dovrebbe essere più corta di quella originale, giusto!? Invece con quell'if/else aggiungi qualcosa ad ogni iterazione sulla stringa originale.
Inoltre cosa accadrebbe se nella stringa originale ci fossero due spazi consecutivi?
Le prime cose che mi vengono in mente per risolvere sono:
- utilizzare indici separati per le due stringhe;
- o tenere conto dei caratteri spazio incontrati fino a quel momento.


P.S.
Non dimenticare il terminatore di stringa!
 
else { modificata = frase[i + 1]; }
questa parte puoi eliminarla, non serve
per la stringa che costruisci devi usare un indice diverso inizializzato a zero: quando trovi un carattere non-spazio copi l'i-esimo carattere della stringa iniziale e poi lo incrementi
 
Ci sono riuscito!
Questo è il listato:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

int main(void) {
    char frase[MAX] = "Frase di prova del programma";
    char modificata[MAX];
    
    int i, t;
    t = 0;
    for(i = 0; frase[i] != '\0'; i++) {
        if(!isspace(frase[i])) {
            modificata[t] = frase[i];
            t++;
        }
    }
    
    modificata[t] = '\0';
    
    printf("\n\nLa frase modificata è: %s", modificata);
    
    exit(0);
}

Grazie!
 
Volendo usare i puntatori potresti fare qualcosa del genere:

C:
#include <stdio.h>
#include <ctype.h>

#define MAX 100

int main()
{
    char str_1[MAX] = "F   R A     S      E";
    char str_2[MAX];
    char *p2 = str_2;
    for(char *p1 = str_1; *p1; ++p1)
    {
        if(!isspace(*p1))
        {
            *p2++ = *p1;
        }
    }
    *p2 = '\0';
    printf("%s\n", str_2);
}

Poi potresti provare a svolgere lo stesso esercizio senza utilizzare una seconda stringa.
 
Ho provato a svolgere l'esercizio con i puntatori senza seguire la tua traccia, poi confrontando la mia soluzione con la tua traccia, ho visto che è leggermente diversa:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define MAX 100

int main(void) {
    char frase[MAX] = "Frase di prova del programma";
    char modificata[MAX];
    char *f = frase, *m = modificata;
    
    int lunghezza;

    lunghezza = strlen(frase);
    for(f = frase; f < frase + lunghezza; f++) {
        if(!isspace(*f)) {
            *m = *f;
            m++;
        }
    }
    m++;
    *m = '\0';
    
    printf("\nLa frase inserita è: %s", frase);
    printf("\nLa frase modificata è: %s", modificata);

    exit(0);
    
}
 
Ho provato a svolgere l'esercizio con i puntatori senza seguire la tua traccia, poi confrontando la mia soluzione con la tua traccia, ho visto che è leggermente diversa: ...
- l'utilizzo di strlen() è superfluo (vai a scandire la stringa frase una volta più del necessario, quando invece basta semplicemente verificare se è stato raggiunto il carattere terminatore di stringa);
- quel m++ fuori dal ciclo non ci vuole, in quanto m già punta alla locazione corretta.
 
Come suggerito ho provato a risolvere l'esercizio senza utilizzare la seconda stringa e quello che sono riuscito a fare è il seguente listato:
C:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAX 100

int main(void) {
    char frase[MAX] = "Frase di prova del programma";
    int i, t;
    
    t = 0;
    for(i = 0; frase[i] != '\0'; i++) {
        if(!isspace(frase[i])) {
            frase[t] = frase[i];
            t++;
        }
        else {
            frase[t] = frase[i + 1];
        }
    }
    
    frase[t] = '\0';
    
    printf("\nLa frase modificata è %s", frase);
    
    exit(0);
}
 
Ok, fornisce il risultato corretto, ma quell'else è superfluo, in quanto ogni assegnazione fatta dalla riga

Codice:
frase[t] = frase[i + 1];

verrà in ogni caso rimpiazzata con un'assegnazione fatta da una delle due seguenti righe di codice:

Codice:
frase[t] = frase[i];

Codice:
frase[t] = '\0';
 
Pubblicità
Pubblicità
Indietro
Top