Elimina lettere doppioni o sottoparole doppie in C

Un paio di esercizi per lavorare con le stringhe in C. Li raggruppo in questo singolo post per le similitudini tra loro. L’idea è quella di leggere una stringa di testo su un opportuno vettore. Una funzione deve individuare i doppioni di lettere consecutive uguali oltre la seconda ripetizione ed eliminarle.

Es. aaaaaabbb123 -> deve diventare -> aabb123

La seconda funzione individua le sottoparole di due lettere uguali e le elimina

Es. aabb123 -> deve diventare -> 123

Come base per entrambi gli esercizi/funzioni, abbiamo creato una funzione di utilità che elimina una lettera in una parola effettuando uno shift delle lettere da destra verso sinistra.

/** 
via parole da due caratteri
Leggi in input una stringa di testo. Elimina da tale stringa le porzioni di sottostringa da due e solo due lettere consecutive.
Es.  aa1234rty   -> 1234rty
*/


/**
Cancella i doppioni di lettera al massimo tenendoli due
Es.  aaaaabbbbbbbai23 -> aabb23

*/

#include <stdio.h>

void cancellaLettera(char parola[], int posizione)
{
  int i=posizione;
  
  //effettuo uno shift da destra a sinistra
  while(parola[i] != '\0')
  {
    parola[i] = parola[i+1];
    i++;
  }
}

void eliminaParoleDaDue(char parola[])
{
  int i=0;
  while (parola[i] != '\0')
  {
    if (parola[i] == parola[i+1] && 
        parola[i+1] != parola[i+2])
    {
      cancellaLettera(parola, i);
      cancellaLettera(parola, i);      
    }  
    else
      i++;
  }    
}

void eliminaTriple(char parola[])
{
  int i=0;
  while (parola[i] != '\0')
  {
    if (parola[i] == parola[i+1] && 
        parola[i+1] == parola[i+2])
      cancellaLettera(parola, i+2);
    else
      i++;
  }  
}

int main() 
{
  char parola[100];

  printf("Inserisci la stringa da analizzare ");
  fgets(parola,100 ,stdin);
  eliminaTriple(parola);
  printf("%s ", parola);  
  eliminaParoleDaDue(parola);
  printf("%s ", parola);
  return 0;
}
  

Ultima modifica 26 Agosto 2022