|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3958
|
sostituire un carattere con due
Ciao ragazzi
Come si fa a trovare in una stringa un certo carattere e a sostituirlo con due. Nel libro thinking in c++ ho trovato una funzione che sostiuisce in una stringa un carattere con un altro es: string gir replace(gir.begin(), gir.end(), 'X', 'Y'); Però io vorrei sapere come si fa a mettere al posto di X ad esempio xz. La domanda nasce, oltre che da una curiosità di carattere generale, anche da una esigenza pratica. Infatti acquisisco da un file di testo delle righe che assegno ad una variabile stringa, però mi sono accorto che in console il carattere "è" o "é" (ma a quanto pare ci sono problemi di visualizzazione, almeno nel mio caso, con tutti i caratteri accentati) sono visualizzati con questo carattere strano Þ. Quindi ho pensato di sostituire "é" con "e'" (quest'ultimo visualizzato senza problemi) ma non so come fare. Esiste un metodo per ottenere questo risultato? Ci sono soluzioni alternative alla mia (anche se prima gradirei sapere se la mia idea è fattibile e come?) ciao e grazie anticipatamente. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
un carattere occupa 1 byte, quindi una stringa occupata tanti byte quanti sono i suoi caratteri, piu il carattere '\0'.
Se vuoi fare una cosa del genere, dovresti copiare la stringa di origine in un buffer d'appoggio, che dovrà essere più grande dell'originale di tanti caratteri in più, quante sono le volte che compare nella stringa il carattere da sostituire. Quindi, ad es., se il carattere è 't', la stringa "tutto" (grande 6 caratteri 't' 'u' t' 't' 'o' '\0') dovrà essere memorizzata in un buffer d'appoggio grande almeno 9 caratteri. Per esemplificare il tutto ti quoto un codice C che sostituisce nella stringa "tutto" ogni occorrenza del carattere 't' con 't i': Codice:
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc, char* argv[]){ char source[6]="tutto"; char* dest; int i,l=0; int count=0; for(i=0;i<=strlen(source);i++) if(source[i]=='t') count++; dest=(char*)calloc(strlen(source)+count,sizeof(char)); for(i=0;i<=strlen(source);i++){ if (source[i]=='t'){ dest[l++]=source[i]; dest[l]='i'; } else dest[l]=source[i]; l++; } printf("%s", dest); } ![]()
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3958
|
si grazie cercavo proprio una cosa del genere però:
1) dovresti commentarmi per piacere questo pezzo di codice ( con i puntatori non ho sufficiente familiarità): Codice:
dest=(char*)calloc(strlen(source)+count,sizeof(char)); for(i=0;i<=strlen(source);i++){ if (source[i]=='t'){ dest[l++]=source[i]; dest[l]='i'; 2)dovrebbe operare su una stringa di tipo string e non char[] uso quasi esclusivamente il c++ (col c litigo) Io ho provato a trasformarla così: Codice:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> using namespace std; int main(){ string source="tutto bene a te bello!"; string* dest; int i,l=0; int count=0; for(i=0;i<=source.length();i++) if(source[i]=='t') count++; dest=source; for(i=0;i<=source.length();i++){ if (source[i]=='t'){ dest[l++]=source[i]; dest[l]='i'; } else dest[l]=source[i]; l++; } cout<<dest<<endl; return 0; } dovrei aggiungere alla lunghezza di source count ma non so come fare Ho provato a riadattare con string il tuo codice: dest=(char*)calloc(strlen(source)+count,sizeof(char)); ma ottengo sempre un messaggio di errore. mi aiuti? grazie |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quello sopra è C
![]() Prova questo...dovrebbe funzionare Codice:
string s = "Stringa in cui cercare" char x = ...; //carattere da cercare int pos = 0; string agg = "xx" //stringa da aggiungere while(1) { if((pos = s.find(x, pos) == string::npos) break; s.remove(pos, 1); s.insert(pos, agg); } |
![]() |
![]() |
![]() |
#5 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: sostituire un carattere con due
Quote:
Nel tuo caso probabilmente la cosa migliore da fare dovrebbe essere qualcosa del genere: Codice:
string s = "è vero o non è vero ?"; while( s.find("è") != string::npos ) s.replace( s.find("è") , 1 , "e'" ); // ora s == "e' vero o non e' vero?" |
|
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Feb 2004
Città: TREVISO
Messaggi: 902
|
Re: Re: sostituire un carattere con due
Quote:
__________________
![]() |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Certo che funziona...trova una stringa al'interno di una stringa... "è" è una stringa che fa parte di "perchè"...
Comunque fra i prototipi della replace su l MSDN non c'è quello con le stringhe... ORa provo... |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Funziona...non era riportato nella documentazione...
![]() |
![]() |
![]() |
![]() |
#9 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: Re: Re: sostituire un carattere con due
Quote:
|
|
![]() |
![]() |
![]() |
#10 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() Sarà meglio che mi ristudi un po' di STL...di fatto non l'ho mai fatta a fondo ![]() |
|
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3958
|
ok grazie a tutti per l'intervento.
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
La migliore documentazione sulla std string la trovate qui
![]() http://www.fz-juelich.de/zam/cxx/cxxkurs.pdf |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Aug 2002
Messaggi: 3958
|
Quote:
l'indirizzo non va!! |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2000
Messaggi: 551
|
Mi sa che l'hanno cambiato il giorno dopo il post
![]() prova questo http://www.fz-juelich.de/zam/cxx/cxx-kurs.pdf naturalmente è un manuale completo (ottimo: c'è un santissimo esempio per ogni cosa) e all'interno trovi la std::string. ciao ![]() Ultima modifica di verloc : 26-05-2004 alle 08:45. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:07.