Rimozione caratteri stringa

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'
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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.
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
U

Utente cancellato 359755

Ospite
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]?
Post unito automaticamente:

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?
 

pabloski

Utente Èlite
2,868
916
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:

rctimelines

Utente Èlite
5,144
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
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
 
U

Utente cancellato 359755

Ospite
[...] 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
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili