Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Eliminare degli elementi da un array di caratteri e ricompattarlo..
Forum - C/C++ - Eliminare degli elementi da un array di caratteri e ricompattarlo.. - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 1:01
Lunedì, 03/09/2018
Per quel poco che ne so, strlen() scorre una stringa per intero in cerca del terminatore '\0'. Dunque, si scorre una volta per intero sia str che rem con strlen() (senza spostare nulla).

Credo che strstr() faccia un bel po' di avanti-e-indietro nella stringa, però anche quella mi dà l'aria di non aver bisogno di spostare nulla.

Immettere gli '\0' "segnaposizione" non sposta memoria, però assegna '\0' un tot di volte (a seconda di quante occorrenze di rem trova in str).

La fase di compattazione sposta solo i caratteri che è necessario spostare e li sposta una sola volta. In effetti sposta sempre un numero di caratteri minore del totale di quelli presenti in str. Il caso più efficiente è quello in cui rem non viene trovato (non c'è niente da compattare!). Il caso meno efficiente e' quello in cui viene trovata una sola occorrenza di rem in testa alla stringa str (tutto quel che segue viene "tirato indietro" di una quantità di posizioni corrispondente alla lunghezza di rem).

Un esempio con le stringhe che hai usato tu, "acacsssdstgfdfgdacacddf" per str e "ac" per rem. Sarà necessario liberarsi di quattro occorrenze di rem, due all'inizio e due verso la fine di str. Così, evidenziando in maiuscolo le lettere che vengono man mano spostate:

Codice sorgente - presumibilmente C/C++

  1. |a|c|a|c|s|s|s|d|s|t|g|f|d|f|g|d|a|c|a|c|d|d|f| // in origine
  2. |0|c|0|c|s|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f| // dopo aver messo gli zeri
  3. |S|c|0|c|S|s|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
  4. |s|S|0|c|s|S|s|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
  5. |s|s|S|c|s|s|S|d|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
  6. |s|s|s|S|s|s|s|S|s|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
  7. |s|s|s|d|S|s|s|d|S|t|g|f|d|f|g|d|0|c|0|c|d|d|f|
  8. |s|s|s|d|s|T|s|d|s|T|g|f|d|f|g|d|0|c|0|c|d|d|f|
  9. |s|s|s|d|s|t|G|d|s|t|G|f|d|f|g|d|0|c|0|c|d|d|f|
  10. |s|s|s|d|s|t|g|F|s|t|g|F|d|f|g|d|0|c|0|c|d|d|f|
  11. |s|s|s|d|s|t|g|f|D|t|g|f|D|f|g|d|0|c|0|c|d|d|f|
  12. |s|s|s|d|s|t|g|f|d|F|g|f|d|F|g|d|0|c|0|c|d|d|f|
  13. |s|s|s|d|s|t|g|f|d|t|G|f|d|f|G|d|0|c|0|c|d|d|f|
  14. |s|s|s|d|s|t|g|f|d|t|g|D|d|f|g|D|0|c|0|c|d|d|f|
  15. |s|s|s|d|s|t|g|f|d|t|g|d|D|f|g|d|0|c|0|c|D|d|f|
  16. |s|s|s|d|s|t|g|f|d|t|g|d|d|D|g|d|0|c|0|c|d|D|f|
  17. |s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|d|0|c|0|c|d|d|F|
  18. |s|s|s|d|s|t|g|f|d|t|g|d|d|d|F|0|0|c|0|c|d|d|F| // inserimento terminatore
  19.                                                 // '\0' nella XVI posizione



L'ultima porzione di memoria viene spostata, come tutte le altre, una sola volta.
Questo fin dove riesco ad arrivare coi ragionamenti. Ogni tanto mi si inchiodano un po' le rotelle...

Ultima modifica effettuata da AldoBaldo il 03/09/2018 alle 1:02


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 1:22
Lunedì, 03/09/2018
Qui si legge molto meglio: http://tinyurl.com/yc4ydrqo


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 19:49
Lunedì, 03/09/2018
Testo quotato

Postato originariamente da AldoBaldo:

Qui si legge molto meglio: http://tinyurl.com/yc4ydrqo



Ti ringrazio veramente per le risposte e per l'aiuto che mi stai fornendo, ho capito il tuo ragionamento.

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo