Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Sostituire stringa all'interno di una stringa
Forum - C/C++ - Sostituire stringa all'interno di una stringa

Avatar
RENOOB (Normal User)
Newbie


Messaggi: 15
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 23:43
Lunedì, 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

  1. 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++

  1. #include <iostream>
  2.  
  3. using namespace std;
  4. int main() {
  5.  char* Partenza; Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str> edjwnekjfnwkefnw";
  6.  char* Tag; Tag = "<str>";
  7.  char* Sos; Sos = "prova";
  8.  string Risultato; char Data; int e = 0; int continua= 0; int i; int c;
  9. for (i=0;i<strlen(Partenza);i++,c++)
  10. {
  11. Data = Partenza[i];
  12. if (Partenza[i]==Tag[e]){
  13. Data = Sos[e];
  14.   e++;
  15.  }
  16.  Risultato = Risultato + Data;
  17. }
  18. cout << Risultato << endl;
  19. system("pause");
  20.     return 0;
  21. }



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#

  1. #include <iostream>
  2.  
  3.  
  4. using namespace std;
  5.  int main() {
  6.  char* Partenza; Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str> edjwnekjfnwkefnw";
  7.  char* Tag; Tag = "<str>";
  8.  char* Sos; Sos = "prova";
  9.  string Risultato; char Data; int e = 0; int continua= 0; int i; int c; int a; string d;
  10.  for (i=0;i<strlen(Partenza);i++,c++)
  11.  {
  12.  Data = Partenza[i];
  13.  if (Partenza[i]==Tag[e]){
  14.   for (a=0;a<strlen(Tag);a++){
  15.    if (Partenza[i+a] == Tag[a] ){
  16.     //cout << endl << Partenza[i+a] << endl;
  17.     d = d + Partenza[i+a]
  18.  
  19.     if (a == strlen(Tag);-1) {
  20.       if (d == Tag){
  21.        
  22.      cout << "sostituisci";
  23.      
  24.      }
  25.      }
  26.    
  27.     }
  28.    }
  29.  
  30.  Data = Sos[e];
  31.  e++;
  32.  }
  33.  Risultato = Risultato + Data;
  34.  }
  35.  cout << Risultato << endl;
  36.  system("pause");
  37.  return 0;
  38. };



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
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 13:51
Martedì, 12/04/2011
Dovresti costruire la stringa secondo i tuoi voleri. Per farlo, però, dovresti usare la classe STANDARD DEL C++ contenuta nell'header <string>

REFERENCE: http://www.cplusplus.com/reference/string/string/

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 14:46
Martedì, 12/04/2011
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#

  1. #include <tchar.h>
  2. #include <iostream>
  3. #include <string>
  4. using namespace std;
  5.  
  6. string StrReplaceBetweenTag(string Partenza, string NuovaStringa, string Tag)
  7. {
  8.         // Inizializzo le sottostringhe iniziali e finali del Tag
  9.         string StartTag = "<"+Tag+">";
  10.         string EndTag = "</"+Tag+">";
  11.  
  12.         // Posizione del tag nella string di partenza
  13.         int Start = Partenza.find(StartTag);
  14.  
  15.         // Se il tag è presente nella stringa continuo
  16.         // Altrimenti ritorno la stringa di partenza
  17.         if (Start > -1) {
  18.                 //Posiziono l'inizio della sostituzione, dopo il tag di apertura
  19.                 Start += StartTag.size();
  20.  
  21.                 // Posizione del tag di chiusura
  22.                 int End = Partenza.find(EndTag);
  23.  
  24.                 if (End > -1) {
  25.                         int Length = End-Start;
  26.                         Partenza.replace(Start, Length, NuovaStringa);
  27.                 }
  28.                 else
  29.                         Partenza.replace(Start, Partenza.size(), NuovaStringa);
  30.  
  31.                 return Partenza;
  32.  
  33.         }
  34.         else
  35.                 return Partenza;
  36. }
  37.  
  38. int _tmain(int argc, _TCHAR* argv[])
  39. {
  40.         string Partenza = "eefrf erfekjrfjernfkenkrjfnejrnfek <str>edjwnekjfnwkefnw</str> blabla";
  41.         string NewString = "prova";
  42.         string Tag = "str";
  43.         cout<<StrReplaceBetweenTag(Partenza, NewString, Tag)<<endl;
  44.         system("PAUSE>null");
  45.         return 0;
  46. }



Ultima modifica effettuata da a_butta il 12/04/2011 alle 14:47


PM Quote
Avatar
RENOOB (Normal User)
Newbie


Messaggi: 15
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 17:57
Martedì, 12/04/2011
Grazie a tutti!!!

Comunque ci sono riuscito!

questo è il codice finale:
Codice sorgente - presumibilmente C#

  1. #include <iostream>
  2. using namespace std;
  3. int main() {
  4. char* Partenza; Partenza = "eefrf erf| <DATA> |ekjrfjernfkenkrjfnejrnfek ed| <DATA> |edjwnekjfnwkefnw"; cout <<Partenza<<endl;
  5. char* Tag; Tag = "<DATA>";
  6. char* Sos; Sos = "23/11/10";
  7. string Risultato; string Data; int e = 0; int continua= 0; int i; int c; int a; string d;
  8.  for (i=0;i<strlen(Partenza);i++,c++) {
  9.   Data = Partenza[i];
  10.    if (Partenza[i]==Tag[0]){
  11.     for (a=0;a<strlen(Tag);a++){
  12.      if (Partenza[i+a] == Tag[a] ){
  13.       d = d + Partenza[i+a];
  14.       if (a == strlen(Tag)-1) {
  15.        if (d == Tag){
  16.         Data = Sos;
  17.         i = i +  strlen(Tag)-1;
  18.        }
  19.       }
  20.      }
  21.     }
  22.      d="";
  23.    }
  24.   Risultato = Risultato + Data;
  25.  }
  26.  cout << Risultato << endl;
  27.  system("pause");
  28.  return 0;
  29. };



Ho comunque trovando molto interessanti le vostre risposte! :k:

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:12
Martedì, 12/04/2011
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 :asd:
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 :) )

PM Quote
Avatar
RENOOB (Normal User)
Newbie


Messaggi: 15
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 21:07
Martedì, 12/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++

  1. String str = "Inizio <str>Stringa</str> Fine";



in parole povere, risalire a 'Stringa'.

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 13:56
Mercoledì, 13/04/2011
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++

  1. 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


PM Quote