2010-11-12 15 views
7

InputString: "I am unwell" "We need to go to the doctor" "How long will it take?".rimuovere tutte le occorrenze di un carattere nella stringa C - Esempio necessario

OutputString: I am unwell We need to go to the doctor How long will it take?

La stringa ha bisogno di pulizia di tutte le occorrenze della char ". Mi viene in mente la funzione approacg seguente

  1. Usa, strchr() trovando prima occorrenza di "
  2. Spostare tutti i caratteri della stringa che altri hanno lasciato una volta la posizione.

Ripetere i passaggi 1 e 2, finché strchr() non restituisce un puntatore NULL.

Ritengo che questo sia un modo molto inefficace per affrontare questo problema. Devo sapere, se ci sono altri metodi per raggiungere questo obiettivo? Pseudo codice o codice effettivo saranno entrambi apprezzati.

+0

carattere a un dato indice; http://stackoverflow.com/questions/5457608/how-to-remove-the-character-at-a-given-index-from-a-string-in-c –

risposta

17
for (s=d=str;*d=*s;d+=(*s++!='"')); 
+2

Un altro: '* s ++ - '"' && d ++ ' – ephemient

+0

@ephemient: Sì beh, voglio tenerlo leggibile e istruttivo. ;-) –

+0

@R - potresti spiegare come funziona? Capisco che un char * in c è un array di caratteri terminato da '\ 0'. Non si elimina alcun carattere '"' in loop for. Inoltre, qual è il comportamento di 'd + = (* s ++! = '"') '. Di seguito c'è una piccola spiegazione di' Leftium', ma non spiega cosa fare quando la condizione 'if 'nella riga 2 –

0

Invece di spostare i caratteri "sul posto" per sovrascrivere il carattere eliminato, creare una nuova stringa.

Ciò minimizza il numero di caratteri copiati copiando ogni carattere valido una volta. Con il metodo originale, i caratteri vicino alla fine della stringa vengono copiati n volte, dove n è il numero di caratteri non validi che lo precedono.

+0

Questo è inefficiente. Il mio algoritmo è in-place o out-of-place (l'ho scritto sul posto ma funziona) e copia una volta ciascun carattere. –

9

È possibile eseguire questa operazione visitando ogni carattere della stringa una volta. Che, fondamentalmente, copiare la stringa su se stesso, saltando i "personaggi:

pseudocodice:

  1. Inizia con due puntatori:.. Origine e la destinazione Entrambi punto al primo carattere della stringa
  2. Se * SOURCE == NULL impostato * DESTINATION = NULL. Stop.
  3. Se * SOURCE! = "Set * DESTINATION = * SOURCE e incrementa DESTINATION.
  4. Incremento SOURCE. Passare al punto 2.

codice:

// assume input is a char* with "I am unwell\" \"We need to go..." 

char *src, *dest; 

src = dest = input; // both pointers point to the first char of input 
while(*src != '\0') // exit loop when null terminator reached 
{ 
    if (*src != '\"') // if source is not a " char 
    { 
     *dest = *src; // copy the char at source to destination 
     dest++;  // increment destination pointer 
    } 
    src++;    // increment source pointer 
} 
*dest = '\0';   // terminate string with null terminator    

// input now contains "I am unwell We need to go..." 

aggiornamento: corretti alcuni bug nel codice

+0

+1 per una bella spiegazione del mio ciclo conciso. –

+0

In realtà il tuo codice ha un bug. Come scritto, inizia a leggere il primo byte e scrive il secondo, in modo che clobber il proprio input. È necessario incrementare 'destination' * dopo * memorizzandolo su di esso, non prima, ed eliminare completamente l'incremento finale di' destination'. –

+0

E 'destination = NULL; // termina la stringa con il codice NULL' non corrisponde al commento. '* destination = '\ 0'; // terminare la stringa con NUL "avrebbe più senso. Inoltre, si noti che '" ... "' è un 'const char *', non un 'char *' - come per la specifica C, scrivere su di esso è un comportamento indefinito. – ephemient

0

Se la stringa non è molto grande, la risposta ovvia sarebbe quella di avere un separato stringa. Un singolo ciclo fino a ottenere \ 0 (Fine della stringa) Avere un ciclo (fornisce O (n)) e un confronto per verificare se la posizione corrente della stringa è il carattere in questione (di nuovo O (n))

In tutto:


s1 = original array 
    s2 = new array to store the final result 
    c = character in question. 
    current_pointer = 0 
    new_pointer =0 
    while(s1[current_pointer] != '\0') { 
    ele = s1[current_pointer] ; 

    if(ele != c) { 
    s2[new_pointer++] = ele 
    } 
    current_pointer++ 
    } 

si noti che questo metodo funziona solo quando le dimensioni sono piccole stringhe.Dobbiamo cercare metodi migliori con l'aumentare delle dimensioni della stringa.

Spero che questo aiuti.

Problemi correlati