Rimozione caratteri stringa

Pubblicità
U

Utente cancellato 359755

Ospite
Innanzitutto buongiorno;
ho un problema con un esercizio che mi chiede di rimuovere la sequenze 'mi' da una stringa in ingresso. Posto il blocco di codice riguardante a come ho pensato di risolvere ciò.
C:
char parola[10];
char nuovo[10];
for (int i=0; i<10; i++){
    if(parola[i]!='\0' && parola[i+1]!='\0'){
        if(parola[i]!='m' && parola [i+1]!='i'){
            nuovo[i]=parola[i];
            }
        }
}
printf("%s", nuovo);

tuttavia quando eseguo il programma o escono caratteri speciali oppure si ferma a quando trova la sequenza 'mi' nel senso che se inserisco 'solmifa' stampa solo 'sol' invece di 'solfa'
 
1) Se trovi "mi" devi incrementare i di due valori, non di 1 (sennò salti "m" ma lasci la "i").
2) Devi usare due indici diversi per parola e nuovo (sennò attualmente nuovo[] sarà "sol_ifa").
3) Nel primo if togli la seconda condizione (a te va bene che i+1 sia "\0"). E ricordati di finire nuovo[] col carattere di terminazione.
 
Ciao.

Intanto la verifica della terminazione la puoi fare solo su i+1.. dopo non troverai più la sequenza "mi".

Poi, dovresti "travasare" nella nuova stringa tutti i caratteri che trovi e semplicemente saltare nel caso ci sia "mi".. quindi il flusso deve processare sempre e tutta la stringa, ma la condizione evita di portare in quella nuova i caratteri che non servono.



Inviato dal mio Nexus 6P utilizzando Tapatalk
 
E poi, se controlli la terminazione non serve sapere la lunghezza della stringa, quindi non metterei un ciclo for. Se invece conosci già la lunghezza non serve che controlli quando termina.

La verifica puoi condurla per il carattere "m" fino al penultimo (ciclo fino a 8) oppure cerchi sia il terminatore sia la "i" e, se trovi questa, controlli se prima c'è una "m"

Insomma, ci sono un sacco di modi rapidi per fare ciò che ti chiedono. Ragionare sulle varie modalità ti permette di pensare ad applicazioni diverse o strategie più efficienti.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
1) Se trovi "mi" devi incrementare i di due valori, non di 1 (sennò salti "m" ma lasci la "i").
2) Devi usare due indici diversi per parola e nuovo (sennò attualmente nuovo[] sarà "sol_ifa").
3) Nel primo if togli la seconda condizione (a te va bene che i+1 sia "\0"). E ricordati di finire nuovo[] col carattere di terminazione.

C:
for (i=0, s=0; i<10, s<=10; i++, s++){
    if(parola[i+1]!='\0'){
        if(parola[i]!='m' && parola [i+1]!='i'){
            nuovo[s]=parola[i];
            }
        }
}
nuovo[10]='\0';
printf("%s", nuovo);
rimane sempre lo stesso problema, ossia se inserisco ad esempio 'fmsakp' stampa solo 'f' e si ferma, inoltre non ho compreso dove devo incrementare di 2 invece che di 1, mica nel secondo if in parola[i+1]?
--- i due messaggi sono stati uniti ---
E poi, se controlli la terminazione non serve sapere la lunghezza della stringa, quindi non metterei un ciclo for. Se invece conosci già la lunghezza non serve che controlli quando termina.

La verifica puoi condurla per il carattere "m" fino al penultimo (ciclo fino a 8) oppure cerchi sia il terminatore sia la "i" e, se trovi questa, controlli se prima c'è una "m"

Insomma, ci sono un sacco di modi rapidi per fare ciò che ti chiedono. Ragionare sulle varie modalità ti permette di pensare ad applicazioni diverse o strategie più efficienti.

Inviato dal mio Nexus 6P utilizzando Tapatalk
senza ciclo for intendi sostituirlo con while o do while o proprio senza cicli?
 
rimane sempre lo stesso problema

Ci sono vari errori. Intanto perchè i=0..<10? Non puoi usare strlen(parola)?

In questo modo non c'è nessun motivo per controllare esplicitamente la presenza del carattere di terminazione.

Poi perchè i e s avanzano di pari passo? Cioè se trova mi, i avanza come dovrebbe, ma s lo segue. Se mi si trova nella posizione 3 di parola, i salterà fino a 5, ma così farà pure s. E nelle posizioni 3 e 4 di nuovo cosa ci sarà? Un buco?

Quindi s va incrementato in if(parola!='m' && parola [i+1]!='i')

Poi quando quell'if è true, perchè i continua ad avanzare di 1? Si posizionerà sulla i e te la copierà in nuovo. Ma tu vuoi che non vengano copiati nè m nè i, altrimenti non rimuovi mi ma solo m.
 
Ultima modifica:
Ooooohh.. sempre più complicato!

Si. Per uscire da un loop con una condizione, tipo trovare la terminazione dell'array, non devi usare un ciclo for con in if all'interno, ma.semplicemente un ciclo while!
Se usi il for, come to ho detto, o consideri la lunghezza fissa oppure lo fai continuare per tutta la lunghezza dell'array strlen() .. come detto sopra, quindi la condizione all'intero del ciclo sparisce.

Prima di trasferire un carattere a nuovo Array controlli se si tratta di un terminatore (ciclo while) oppure di un carattere che stai cercando. Attenzione perito, tu cerchi una coppia di caratteri, quindi prima di NON trasferirli, devi nidificare una seconda condizione per verificare il carattere successivo.

Penso di essere stato abbastanza chiaro, mi sembra di averti descritto verbalmente un diagramma a blocchi.. il codice non te lo posso scrivere io!

Un'altra cosa, ma è un mio personale.. anche se si può fare, io non metterei due indici nel ciclo for. Usalo singolo e metti, eventualmente un contatore per suo conto.. d'altra parte non è nemmeno logicamente corretto in quanto in quel ciclo for doppio, la verifica va fatta su un solo indice.

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
[...] Penso di essere stato abbastanza chiaro, mi sembra di averti descritto verbalmente un diagramma a blocchi.. il codice non te lo posso scrivere io![...]

Sì sei stato abbastanza chiaro, ti ringrazio. Terrei però a precisare due cose riguardo a questa frase:
1) non ho scritto da nessuna parte che qualcuno di voi mi dovesse scrivere il codice, ho infatti postato ciò a cui ero giunto da solo, nella speranza che qualcuno mi dicesse dove avevo sbagliato e mi aiutasse a "partorire" (passatemi il termine) un ragionamento corretto e valido per risolvere il quesito; NON il codice
2) se non volevi rispondere non eri assolutamente tenuto
3) penso che lo spirito di questa community sia aiutarsi a vicenda, o sbaglio?
Detto ciò ti ringrazio nuovamente e anche gli altri che mi hanno aiutato.

P.S. Non è ASSOLUTAMENTE mia intenzione fare polemica, ma è solo per puntualizzare visto che mi ha dato leggermente fastidio quest'affermazione del tutto infondata.

Cordiali saluti a tutti
 
Pubblicità
Pubblicità
Indietro
Top