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++ - una funzione restituisce caratteri strani
Forum - C/C++ - una funzione restituisce caratteri strani

Avatar
RENOOB (Normal User)
Newbie


Messaggi: 15
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 14:11
Mercoledì, 31/08/2011
volevo fare pratica con le array e i puntatori, così ho creato una funzione che estrapolasse una frase se preceduta e terminata da un determinato separatore.

nonostante nella funzione il risultato è corretto, quello restituito è sballato da dei caratteri altrettanto strani.
il punto è che non capisco cosa lo causa, non sembra essere un problema del codice :-|

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5.  typedef struct SET
  6.     {
  7.         char* strE;
  8.         char* simE;
  9.         int pIdsE;
  10.         char* retE;
  11.     };
  12.  
  13. char* StrEx(SET &SOT)
  14. {
  15.  
  16.     char* str = SOT.strE;
  17.     char* sim = SOT.simE;
  18.     int pIdS = SOT.pIdsE;
  19.  
  20.     int pDs = 0;
  21.     int nSimMin = -1;
  22.     int nSimMax = -1;
  23.     int nStrC = strlen(str);
  24.     int nSimC = strlen(sim);
  25.  
  26.     for (int i=0;i<nStrC;i++)
  27.     {
  28.         if (str[i] == sim[0])
  29.         {
  30.             if (i <= nStrC-nSimC)
  31.             {
  32.                 for (int b = 1;b < nSimC;b++)
  33.                 {
  34.                     if (str[i+b] == sim[b])
  35.                     {
  36.                         nSimMin = i;
  37.                     }
  38.                     else
  39.                     {
  40.                         nSimMin = -1;
  41.                         break;
  42.                     }
  43.                 }
  44.  
  45.                 if(nSimMin != -1)
  46.                 {
  47.                   i = i+nSimC;
  48.                   nSimMin = nSimMin+nSimC;
  49.  
  50.                 for (i;i<nStrC;i++)
  51.                 {
  52.                     if(str[i] == sim[0])
  53.                     {
  54.  
  55.                         if (i <= nStrC-nSimC)
  56.                         {
  57.                             for (int b = 1;b < nSimC;b++)
  58.                             {
  59.  
  60.                                 if (str[i+b] == sim[b])
  61.                                 {
  62.                                     nSimMax = i;
  63.                                 }
  64.                                 else
  65.                                 {
  66.                                     nSimMax = -1;
  67.                                     break;
  68.                                 }
  69.                             }
  70.                             break;
  71.                         }
  72.  
  73.                     }
  74.                 }
  75.                 }
  76.                 if (nSimMax == -1 || nSimMin == nSimMax)
  77.                 {
  78.                     break;
  79.                 }
  80.  
  81.                 if (nSimMax != -1) {i = i+nSimC; pDs++;}
  82.                 if (pIdS == pDs)
  83.                 {
  84.  
  85.                     int doE = nSimMax-nSimMin;
  86.                     char res[doE];
  87.                     for(int iE=nSimMin;iE<nSimMax;iE++)
  88.                     {
  89.                     res[iE-nSimMin] = str[iE];
  90.                     }
  91.                     cout << res << "\n";
  92.                     SOT.retE = res;
  93.                     return res;
  94.  
  95.                 }
  96.                 nSimMax = -1;
  97.                 nSimMin = -1;
  98.  
  99.             }
  100.         }
  101.     }
  102. }
  103.  
  104.  
  105.  
  106.  
  107.  
  108.  
  109. int main()
  110. {
  111.  
  112.     //FILE* pf;
  113.     //pf = fopen("ciao.txt","r");
  114.     //char read[10064];
  115.     //fscanf(pf,"%s",read);
  116.     //fclose(pf);
  117.     char* read = "<^{`[\"(~|1006SOURCE1006|~)\"]`}^>valore<^{`[\"(~|1006SOURCE1006|~)\"]`}^>";
  118.  
  119.     SET ptr;
  120.     ptr.strE = read;
  121.     ptr.simE = "<^{`[\"(~|1006SOURCE1006|~)\"]`}^>";
  122.     ptr.pIdsE = 1;
  123.  
  124.     cout << StrEx(ptr) << "\n";
  125.     cout << ptr.retE << "\n";
  126.  
  127.     //pf = fopen("hallo.txt","w");
  128.     //fprintf(pf,"%s", ptr.retE);
  129.     //fclose(pf);
  130.  
  131.     //system("notepad hallo.txt");
  132.  
  133.     system("pause");
  134.     return 0;
  135. }



in allegato troverete ciò che stampa... non so come spiegarmelo.


RENOOB ha allegato un file: c.jpeg (694998 bytes)
Clicca qui per guardare l'immagine
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 15:48
Mercoledì, 31/08/2011

secondo me il codice che hai scritto è un overkill, ho già implementato una cosa di questo genere e non andava oltre le 10 righe

PM Quote
Avatar
RENOOB (Normal User)
Newbie


Messaggi: 15
Iscritto: 11/04/2011

Segnala al moderatore
Postato alle 16:59
Mercoledì, 31/08/2011
definisci overkill

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 19:36
Mercoledì, 31/08/2011

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:23
Mercoledì, 31/08/2011


Il mio blog: https://piero.dev
PM Quote