Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23

    [C++] problema stringa

    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
    codice:
    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?

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    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.
    RTFM Read That F*** Manual!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2011
    Messaggi
    23
    grazie proverò cosi. in effetti fino ad adesso ho provato a modificare la stringa mentre la scorrevo, con risultati pessimi.

  4. #4
    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:
    codice:
    #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).
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.