PDA

Visualizza la versione completa : [C++] Cancellare tutti i caratteri di una stringa che non appartengono a un array


robdb
06-09-2011, 13:27
come posso cancellare da una stringa tutti i caratteri che non appartengono ad un array di caratteri creato in precedenza? mi spiego meglio: ho un array di caratteri del tipo

char ALPH[21]={'A','B',.....'Z'}
contenente le lettere dell'alfabeto italiano. Considerando una stringa generica, come posso eliminare da essa tutti i caratteri (spazi, @, segni di punteggiatura) che non appartengono ad ALPH?

valia
06-09-2011, 14:07
io farei:
stringa partenza --> contiene tutti i caratteri da controllare
stringa destinazione --> contiene la stringa purgata
stringa caratteri --> contiene i caratteri da purgare


scorri partenza carattere per carattere e controlli se il carattere i-esimo (quello che vedi) è contenuto nella stringa caratteri.
Se si vai avanti, se no lo copi in destinazione.
Alla fine destinazione contiene tutti i caratteri per te buoni.
E' una soluzione non ottimizzata, ma è chiara, pulita e lineare (almeno per capire che fai).
Ti sconsiglio mal di testa eccessivi tentando di modificare la stringa di partenza mentre la scorri.

robdb
06-09-2011, 15:08
grazie proverò cosi. in effetti fino ad adesso ho provato a modificare la stringa mentre la scorrevo, con risultati pessimi. :)

MItaly
06-09-2011, 19:32
L'approccio più semplice per la modifica "in-place" è quello di usare un puntatore in lettura e uno in scrittura; per controllare se il carattere va bene puoi usare la funzione strchr per cercare nella stringa contenente i soli caratteri validi. Esempio:


#include <cstring>

// ...

void PurgeString(char * Str, const char * Valid)
{
const char * readPtr=Str;
char * writePtr=Str;
while(*readPtr)
{
if(std::strchr(Valid,*readPtr)!=NULL)
writePtr++;
*writePtr=*readPtr;
readPtr++;
}
*writePtr=0;
}

// ...
char stringa="Ciao mondo!";
char valid="AEIOUaeiou";
PurgeString(stringa, valid);
// stringa ora vale "iaooo"

D'altra parte, se tutto quello che vuoi è semplicemente tenere i caratteri alfabetici e maiuscoli, ti basta usare la funzione std::isupper per il controllo del carattere, che è molto più veloce che iterare su tutto un array ad ogni carattere (la funzione diventa O(N) invece di O(N*M), con N lunghezza della stringa e M numero di caratteri validi).

Loading