RENOOB (Normal User)
Newbie
Messaggi: 15
Iscritto: 11/04/2011
|
Mi serve un modo per sostituire una stringa all'interno di una stringa con una diversa.
Faccio un esempio per semplificare il concetto:
Codice sorgente - presumibilmente Plain Text |
Char* str; str = "<luogo>, <data> \n\n Spett.le <ditta> \n <via> \n <cap> <luogo> <provincia> \n <piva>";
|
intanto mi basta riuscire a sostituire <data> con 23/11/10.
Premetto che vengo da un linguaggio tutto diverso e la roba dei puntatori mi deve ancora entrare in testa.
Sono riuscito a fare una specie di codice:
Codice sorgente - presumibilmente C++ |
#include <iostream> using namespace std; int main() { char* Partenza; Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str> edjwnekjfnwkefnw"; char* Tag; Tag = "<str>"; char* Sos; Sos = "prova"; string Risultato; char Data; int e = 0; int continua= 0; int i; int c; for (i=0;i<strlen(Partenza);i++,c++) { Data = Partenza[i]; if (Partenza[i]==Tag[e]){ Data = Sos[e]; e++; } Risultato = Risultato + Data; } cout << Risultato << endl; system("pause"); return 0; }
|
Ma è poco funzionale, visto che se incontra caratteri uguali ai primi della stringa da sostituire li sostituisce, più o meno ho in mente la dinamica di come farlo venir fuori, è solo che è più difficile a dirsi che a farsi.
Dovrei caricare un for che controlla se i caratteri successivi sono anche uguali a quelli successivi della stringa sostitutiva, altrimenti saltare e non sostituire niente...
Codice sorgente - presumibilmente C# |
#include <iostream> using namespace std; int main() { char* Partenza; Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str> edjwnekjfnwkefnw"; char* Tag; Tag = "<str>"; char* Sos; Sos = "prova"; string Risultato; char Data; int e = 0; int continua= 0; int i; int c; int a; string d; for (i=0;i<strlen(Partenza);i++,c++) { Data = Partenza[i]; if (Partenza[i]==Tag[e]){ for (a=0;a<strlen(Tag);a++){ if (Partenza[i+a] == Tag[a] ){ //cout << endl << Partenza[i+a] << endl; d = d + Partenza[i+a] if (a == strlen(Tag);-1) { if (d == Tag){ cout << "sostituisci"; } } } } Data = Sos[e]; e++; } Risultato = Risultato + Data; } cout << Risultato << endl; system("pause"); return 0; };
|
Ho provato a implementare quel for ma continua a darmi errore!!
non capisco quale sia il problema!
Vi prego, aiutatemi! sono stato troppo viziato dal mio vecchio linguaggio.
datemi solo consigli e dove sbaglio, voglio arrivarci da solo! Ultima modifica effettuata da RENOOB il 11/04/2011 alle 23:45 |
|
()
Newbie
Messaggi:
Iscritto:
|
|
|
a_butta (Member)
Expert
Messaggi: 578
Iscritto: 16/03/2010
|
Come sosteneva Template, utilizzando la libreria <string> e il namespace std, se ho ben capito la tua richiesta, questa potrebbe essere una funzione:
Codice sorgente - presumibilmente C# |
#include <tchar.h> #include <iostream> #include <string> using namespace std; string StrReplaceBetweenTag(string Partenza, string NuovaStringa, string Tag) { // Inizializzo le sottostringhe iniziali e finali del Tag string StartTag = "<"+Tag+">"; string EndTag = "</"+Tag+">"; // Posizione del tag nella string di partenza int Start = Partenza.find(StartTag); // Se il tag è presente nella stringa continuo // Altrimenti ritorno la stringa di partenza if (Start > -1) { //Posiziono l'inizio della sostituzione, dopo il tag di apertura Start += StartTag.size(); // Posizione del tag di chiusura int End = Partenza.find(EndTag); if (End > -1) { int Length = End-Start; Partenza.replace(Start, Length, NuovaStringa); } else Partenza.replace(Start, Partenza.size(), NuovaStringa); return Partenza; } else return Partenza; } int _tmain(int argc, _TCHAR* argv[]) { string Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str>edjwnekjfnwkefnw</str> blabla"; string NewString = "prova"; string Tag = "str"; cout<<StrReplaceBetweenTag(Partenza, NewString, Tag)<<endl; system("PAUSE>null"); return 0; }
|
Ultima modifica effettuata da a_butta il 12/04/2011 alle 14:47 |
|
RENOOB (Normal User)
Newbie
Messaggi: 15
Iscritto: 11/04/2011
|
Grazie a tutti!!!
Comunque ci sono riuscito!
questo è il codice finale:
Codice sorgente - presumibilmente C# |
#include <iostream> using namespace std; int main() { char* Partenza; Partenza = "eefrf erf| <DATA> |ekjrfjernfkenkrjfnejrnfek ed| <DATA> |edjwnekjfnwkefnw"; cout <<Partenza<<endl; char* Tag; Tag = "<DATA>"; char* Sos; Sos = "23/11/10"; string Risultato; string Data; int e = 0; int continua= 0; int i; int c; int a; string d; for (i=0;i<strlen(Partenza);i++,c++) { Data = Partenza[i]; if (Partenza[i]==Tag[0]){ for (a=0;a<strlen(Tag);a++){ if (Partenza[i+a] == Tag[a] ){ d = d + Partenza[i+a]; if (a == strlen(Tag)-1) { if (d == Tag){ Data = Sos; i = i + strlen(Tag)-1; } } } } d=""; } Risultato = Risultato + Data; } cout << Risultato << endl; system("pause"); return 0; };
|
Ho comunque trovando molto interessanti le vostre risposte!
|
|
()
Newbie
Messaggi:
Iscritto:
|
Ricorda sempre: gli array, per quanto utili, hanno alcuni bruttissimi limiti, che i contenitori standard del C++ risolvono. Questi contenitori sono:
1 - vector (la classe string è una specializzazione della classe template vector)
2 - map / hashmap
3 - valarray
4 - stack
5 - queue
Ce ne sono altri, ma al momento non me li ricordo
Sono argomenti che, studiando il C++, prima o poi ti troverai ad affrontare. Studiali con attenzione. Prima di tutto, però, studia il funzionamento delle classi (astrazione, ereditarietà, funzioni friend e virtual...) Il C++ è bellissimo, ma richiede molto studio e applicazione (io lo studio da 2 anni, e ancora ho problemi con le classi e l'allocazione dinamica della memoria )
|
|
RENOOB (Normal User)
Newbie
Messaggi: 15
Iscritto: 11/04/2011
|
@a_butta
è possible risalire al contenuto del tag? cioè dare a una variabile ciò che c'è scritto tra <str> e </str>?
ad esempio:
Codice sorgente - presumibilmente C/C++ |
String str = "Inizio <str>Stringa</str> Fine";
|
in parole povere, risalire a 'Stringa'.
|
|
a_butta (Member)
Expert
Messaggi: 578
Iscritto: 16/03/2010
|
Certo: una volta trovate le variabili START e LENGTH (cioè i contatori da cui inizia la sottostringa e la lunghezza di essi), ottieni la tua sottostringa semplicemente come:
Codice sorgente - presumibilmente C/C++ |
string SottoStringa = Partenza.substr(Start,Length);
|
EDIT: ovviamente tutto prima che tua abbia trasformato la tua stringa di partenza
Ultima modifica effettuata da a_butta il 13/04/2011 alle 13:58 |
|