C - ELIMINAZIONE DOPPIE DA UN ARRAY DI CHAR

di il
2 risposte

C - ELIMINAZIONE DOPPIE DA UN ARRAY DI CHAR

Salve, come da titolo avrei bisogno di un aiuto sul seguente codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    char *s1;
    int i, j, dim;
    printf("Inserire la dimensione della stringa: ");
    scanf("%d",&dim);
    dim++;        //incremento necessario per creare lo spazio al carattere terminatore
    while ('\n'!=getchar());          //"mangia" il carattere newline per evitare conflitti con fgets
    s1=(char*)malloc(sizeof(char)*dim);     // allocazione dinamica
    fgets(s1,dim,stdin);         //inserimento stringa
    printf("\n---------------------------------------------------------------\nStringa di partenza: %s",s1); //stampo la stringa inserita da tastiera
    for(i=0;i<dim-1;i++){
        if((s1[i]==s1[i+1]) || (s1[i]+32==s1[i+1]) || (s1[i]==s1[i+1]+32)){
            for(j=i;j<dim;j++){
                char temp=s1[j];
                s1[j]=s1[j+1];
                s1[j+1]=temp;
            }
            dim--;
        }
    }
   
  s1=(char*)realloc(s1,sizeof(char)*dim);
    printf("\n%d\nStringa rielaborata: %s",n,s1);
}

L'idea sarebbe:
-Inserisci la dimensione della stringa
-Alloca dinamicamente la dimensione all'array di char (stringa)
-Inserisci la stringa da tastiera
-Inserisci un ciclo for che scorra i singoli caratteri mediante un indice "i";
-Inserisci un blocco condizionale if per controllare la presenza di doppie
-Inserisci, all'interno del blocco condizionale if, un ciclo for con un indice di scorrimento j che viene posto uguale ad i (posizione dove viene rilevata la sequenza di caratteri uguali) fino a dim-1 ed esegui un tot di scambi tra caratteri per portare a fine stringa i caratteri da eliminare (dunque dopo il carattere terminatore)
-al termine del ciclo for più interno, decrementa di un'unità la variabile dim;
-quando anche il ciclo più esterno sarà finito, rialloca la memoria dell'array per utilizzare solo quella necessaria a contenere il "nuovo" array
-stampa l'array dopo le modifiche;

Penso di aver sbagliato qualcosa negli scambi, nonostante il codice compili. Grazie anticipatamente per chi mi riesce ad indirizzare.

2 Risposte

  • Re: C - ELIMINAZIONE DOPPIE DA UN ARRAY DI CHAR

    Che stringa inserisci? Cosa ottieni?

    Hai controllato l'esecuzione del codice linea per linea per capire cosa succede di sbagliato?
  • Re: C - ELIMINAZIONE DOPPIE DA UN ARRAY DI CHAR

    Ciao Oregon. Qualsiasi sia la stringa inserita, il codice sembra compilare. Se per esempio inserisco da tastiera "ramarro marrone che cade dal burrone burroso" (che fantasia eh?!) l'output che mi viene fuori è: "ramaro marone che cade dal burone buroso". Tecnicamente fa quello che deve fare, ma la domanda che mi pongo è se quello che ho scritto a livello del codice sia corretto. Cerco di spiegarmi meglio:
    il codice che inizialmente avevo scritto era diverso da quello che ho postato e la differenza sta nel for più interno. Prima avevo scritto:
       for(j=i;j<dim-1;j++){
                    char temp=s1[j];
                    s1[j]=s1[j+1];
                    s1[j+1]=temp;
                }
    
    Avevo dunque posto la condizione che j doveva essere incrementato fintanto che j stessa fosse stata minore di "dim-1", e facendo una prova sulla stringa "ramarro" ed inserendo una printf nel corpo del for che mi mostrasse il valore assunto da j in "tempo reale" ho notato che j non si ferma a dim-2, ma arriva comunque a dim-1, il che dovrebbe essere errato. Difatti, se il codice lo andassi a scrivere in questo modo:
    
    for(j=i;j<dim-2;j++){ // ho modificato
                    char temp=s1[j];
                    s1[j]=s1[j+1];
                    s1[j+1]=temp;
                }
    
    troverei come output "ramaror", cioè troverei semplicmente spostata la mia doppia al penultimo carattere, prima del carattere terminatore
Devi accedere o registrarti per scrivere nel forum
2 risposte