L’idea per una possibile soluzione senza scomodare funzioni di copia e unione, è di controllare ogni lettera della parola iniziale, verificare se sia o meno una lettera alfabetica da sostituire e procedere quindi non con la cancellazione ma con uno shift che sovrascrive la lettera incriminata con quella accanto a destra, trascinando tutte le altre. L’ultima lettera sarà per forza vuota e quindi chiuderà il ciclo.
Unica accortezza è nello stare attenti che lo shift sposta la successiva lettera da controllare a quella attuale quindi si deve procedere con l’iterazione in modo opportuno. Ecco perché vale la pena usare un ciclo while.
#include <stdio.h>
#include <string.h>
#define LUNGHEZZA 100
int main()
{
int i,j;
char parola[LUNGHEZZA];
int LUNGHEZZAEFFETTIVA;
printf("Inserisci una parola da ripulire ");
fgets(parola,LUNGHEZZA, stdin);
parola[strlen(parola)-1] = '\0';
LUNGHEZZAEFFETTIVA = strlen(parola);
i = 0;
while (i < LUNGHEZZAEFFETTIVA)
{
//printf("analizzando la lettera %c \n", parola[i]);
if (parola[i]>'a' && parola[i]<'z')
{
printf("elimino %c \n", parola[i]);
//effettuo uno shift da destra a sinistra
for (j = i; j < LUNGHEZZAEFFETTIVA; j++)
{
parola[j] = parola[j+1];
}
}
else
{
//se ho effettuato lo shift a sinistra
//la prossima lettera da controllare è nella
//stessa posizione, altrimenti vado avanti
i++;
}
}
printf("La parola pulita è %s", parola);
return 0;
}
Ultima modifica 17 Novembre 2022