[C] eliminazione caratteri di una stringa

di il
8 risposte

[C] eliminazione caratteri di una stringa

Salve a tutti,vorrei realizzare un programma che elimina i caratteri ripetuti in una stringa
esempio:

ciao sono mario
diventa
ciao snmr


ho realizzato questo programma ma funziona solo in questo caso,negli altri casi no
aiuti?



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(){
char frase[100]="nel mezzo  ";
char nuovastringa[100];
int i;
int j;
int alfa;
int temp;
int temp2;
alfa=strlen(frase);
printf("%d\n",alfa);
for(j=0;j<alfa;j++){
for(i=j;i<alfa-1;i++)	
if(frase[j]==frase[i+1]){
temp=frase[i+1];	
frase[i+1]=frase[alfa-1];
frase[alfa-1]=temp;	
alfa--;		
temp2=frase[i+1];	
frase[i+1]=frase[alfa-2];
frase[alfa-2]=temp2;	
}	
}
printf("%d\n",alfa);

for(i=0;i<alfa;i++){
printf("%c",frase[i]);
}
}





8 Risposte

  • Re: [C] eliminazione caratteri di una stringa

    Supponi di avere un vettore di interi, di lunghezza 256, inizializzato con tutto 0. Chiamiamolo U.
    Ora, tu sai che un carattere puo' anche essere interpretato come un intero che va da 0 a 255.
    Ti ricorda nulla il 256 di prima?

    Ora supponi di avere una stringa, chiamiamola S
    E supponi di avere un buffer (un'altro vettore) che puo' contenere la tua stringa. Chiamiamolo B

    Ora supponi di scandire la tua stringa, partendo dal primo carattere, un carattere alla volta, e ragionare nel seguente modo:

    1) sia c=S l'i-mo carattere della stringa
    2) se U[c] == 1, allora il carattere l'ho gia' Usato, e lo scarto
    3) se U[c] == 0, allora e' la prima volta che lo vedo, QUINDI
    3.1) mi segno che l'ho incontrato: U[c] =1
    3.2) lo copio nella stringa che sto generando: B[j] = c

    Questo e' il 95% dell'esercizio, a te il rimanente 5%

    Nota: il codice VA IDENTATO pena l'espulsione, a vita, dal mondo dei programmatori
  • Re: [C] eliminazione caratteri di una stringa

    migliorabile ha scritto:


    Supponi di avere un vettore di interi, di lunghezza 256, inizializzato con tutto 0. Chiamiamolo U.
    Ora, tu sai che un carattere puo' anche essere interpretato come un intero che va da 0 a 255.
    Ti ricorda nulla il 256 di prima?

    Ora supponi di avere una stringa, chiamiamola S
    E supponi di avere un buffer (un'altro vettore) che puo' contenere la tua stringa. Chiamiamolo B

    Ora supponi di scandire la tua stringa, partendo dal primo carattere, un carattere alla volta, e ragionare nel seguente modo:

    1) sia c=S l'i-mo carattere della stringa
    2) se U[c] == 1, allora il carattere l'ho gia' Usato, e lo scarto
    3) se U[c] == 0, allora e' la prima volta che lo vedo, QUINDI
    3.1) mi segno che l'ho incontrato: U[c] =1
    3.2) lo copio nella stringa che sto generando: B[j] = c

    Questo e' il 95% dell'esercizio, a te il rimanente 5%

    Nota: il codice VA IDENTATO pena l'espulsione, a vita, dal mondo dei programmatori



    non mi è tanto chiario il ragionamento
  • Re: [C] eliminazione caratteri di una stringa

    Crei un vettore con 256 elementi, tanti quanti sono i caratteri totali (se sei sicuro di usare solo lettere nella stringa puoi anche metterne di meno, in base a quali caratteri puoi mettere nella stringa). Ora ogni posizione di quell'array rappresenta un carattere che potrebbe stare nella tua stringa. Inizi a leggere la stringa carattere per carattere e, utilizzando il carattere come intero, lo usi come indice nell'array di numeri (inizializzato con tutti 0 come diceva @migliorabile). Ogni volta che trovi un carattere il cui indice nell'array di numeri è ancora 0, lo copi nella stringa che dovrà risultare (l'altro array di cui parlava miglirabile), e trasformi quell'indirizzo dell'array di numeri in 1, cosï che la prossima volta che trovi lo stesso carattere, ti risulterà non 0 quindi non da mettere nella stringa risultato
  • Re: [C] eliminazione caratteri di una stringa

    ANDPRI ha scritto:


    Crei un vettore con 256 elementi, tanti quanti sono i caratteri totali (se sei sicuro di usare solo lettere nella stringa puoi anche metterne di meno, in base a quali caratteri puoi mettere nella stringa). Ora ogni posizione di quell'array rappresenta un carattere che potrebbe stare nella tua stringa. Inizi a leggere la stringa carattere per carattere e, utilizzando il carattere come intero, lo usi come indice nell'array di numeri (inizializzato con tutti 0 come diceva @migliorabile). Ogni volta che trovi un carattere il cui indice nell'array di numeri è ancora 0, lo copi nella stringa che dovrà risultare (l'altro array di cui parlava miglirabile), e trasformi quell'indirizzo dell'array di numeri in 1, cosï che la prossima volta che trovi lo stesso carattere, ti risulterà non 0 quindi non da mettere nella stringa risultato
    ah ok non ci avevo pensato a questa cosa,ora provo
    quello che non mi è chiario è "utilizzando il carattere come intero "(ti riferisci al codice ascii? per esempio il carattere n corrisponde al valore 110,giusto?
    funziona con la frase "ciao mezzo",ma con altre frasi tipo "nel mezzo" non va cosa sbaglio?
    edit: funziona con tutte frasi in cui i caratteri da eliminare siano presenti esclusivamente nell'ultima parola
    se per esempio invece,il carattere da eliminare si trova già in una parola precedente,non va,e al posto di questi caratteri mi stampa degli spazi.

    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main(){
    char frase[100]="ciao mezzo";
    char nuovastringa[100];
    int vet[256];
    int i;
    int j;
    int alfa; //dim prima stringa
    int beta=0;//dim nuova stringa
    alfa=strlen(frase);
    printf("%d\n",alfa);
    for(i=0;i<256;i++){
    vet[i]=0;
    }
    for(i=0;i<alfa;i++){
    for(j=0;j<256;j++)	
    if(frase[i]+'0'==j &vet[j]==0  ){	
    vet[j]=1;	
    nuovastringa[i]=frase[i];		
    beta++;	
    }		
    }
    printf("%d\n",beta);
    for(i=0;i<beta;i++){
    printf("%c",nuovastringa[i]);
    }
    }
    
    
    
  • Re: [C] eliminazione caratteri di una stringa

    migliorabile ha scritto:


    Supponi di avere un vettore di interi, di lunghezza 256, inizializzato con tutto 0. Chiamiamolo U.
    Ora, tu sai che un carattere puo' anche essere interpretato come un intero che va da 0 a 255.
    Ti ricorda nulla il 256 di prima?

    Ora supponi di avere una stringa, chiamiamola S
    E supponi di avere un buffer (un'altro vettore) che puo' contenere la tua stringa. Chiamiamolo B

    Ora supponi di scandire la tua stringa, partendo dal primo carattere, un carattere alla volta, e ragionare nel seguente modo:

    1) sia c=S l'i-mo carattere della stringa
    2) se U[c] == 1, allora il carattere l'ho gia' Usato, e lo scarto
    3) se U[c] == 0, allora e' la prima volta che lo vedo, QUINDI
    3.1) mi segno che l'ho incontrato: U[c] =1
    3.2) lo copio nella stringa che sto generando: B[j] = c

    Questo e' il 95% dell'esercizio, a te il rimanente 5%

    Nota: il codice VA IDENTATO pena l'espulsione, a vita, dal mondo dei programmatori


    con questo algoritmo però nella nuova stringa che genero(quando scarto il carattere),rimane vuoto l'elemento della stringa che voglio generare,poichè non posso sapere a priori la dimensione della nuova stringa da generare
  • Re: [C] eliminazione caratteri di una stringa

    Nel for devi semplicemente controllare che vet[int(frase)] sia uguale a 1 per eliminare il carattere. Se è 0 invece il carattere non è mai stato usato prima e allora lo fai diventare 1 e aggiungi il carattere alla nuova stringa. Non serve il doppio for
  • Re: [C] eliminazione caratteri di una stringa

    ANDPRI ha scritto:


    Nel for devi semplicemente controllare che vet[int(frase)] sia uguale a 1 per eliminare il carattere. Se è 0 invece il carattere non è mai stato usato prima e allora lo fai diventare 1 e aggiungi il carattere alla nuova stringa. Non serve il doppio for

    grazie
  • Re: [C] eliminazione caratteri di una stringa

    ATTENTO agli indici:

    uno e' una i
    l'altro e' una j

    La questione della lunghezza e' banale: quanto puo' essere lunga, al massimo, la nuova stringa, rispetto alla stringa originale?

    La risposta e', ovviamente, banale!
Devi accedere o registrarti per scrivere nel forum
8 risposte