Es sui puntatori a stringhe

di il
11 risposte

Es sui puntatori a stringhe

Si considerino stringhe definite secondo il seguente formato
"&...&x...x&...&y...y&...&"
dove
&...&
è una sequenza di due o più caratteri &
x...x e y...y
sono sequenze di uno o più caratteri, tutti diversi dal carattere &


Scrivere una funzione che riceve in ingresso un puntatore a una stringa costruita secondo questo formato, e restituisce come risultato due stringhe corrispondenti rispettivamente, alle sottostringhe x...x e y...y della stringa ricevuta in ingresso. Scrivere anche un codice pilota che consenta di verificare la correttezza della funzione

#include<iostream>
#include<string>
using namespace std;
string funzione(char*);

int main()
{
    char* s="&&&xx&&yyyy&&";
    cout<<funzione(s);
return 0;
}

string funzione(char* s)
{
    string p=s;
    int l=p.length();

      int array[l-1];
      int indx=0;

    for(int i=0;i<l;i++)
    {
        if(p.substr(i,1)=="x")
        array[indx]=i;
        indx++;
    }

    int a[l-1];
    int indice=0;
    for(int j=0;j<l;j++)
    {
        if(p.substr(j,1)=="y")
        a[indice]=j;
        indice++;
    }

return p.substr(array[0],array[l-1]);
return p.substr(a[0],a[l-1]);

}
  io ho fatto così mi dà un solo errore nella conversione da char a stringa

11 Risposte

  • Re: Es sui puntatori a stringhe

    Quale return bisogna considerare?
    
    return p.substr(array[0],array[l-1]);
    return p.substr(a[0],a[l-1]);
    
    
    if(p.substr(i,1)=="x")
    
    Non sai che per le stringhe è definito l'operatore [] ?

    Cosa sucede se invece di x e y io ho caratteri diversi da &? Esempio
    
    &&&stringa1&&&&stringa2&&
    
  • Re: Es sui puntatori a stringhe

    La stringa gliela dò io in input con tante x e y quante ne voglio io nel tipo di stringa sopra definito dall'esempio
    e mi devono tornare rispettivamente queste due stringhe
  • Re: Es sui puntatori a stringhe

    Rispondi alle prime domande.
  • Re: Es sui puntatori a stringhe

    Ovviamente è sbagliato il mio programma
    è impossibile che ci siano due return questo l'ho capito
    infatti ne ho scritto un'altra versione
    
    #include<iostream>
    #include<string>
    using namespace std;
    void funzione(char*);
    int main()
    {
        char* p="&&&xxx&&yy&&&&";
        funzione(p);
    return 0;
    }
    void funzione(char* p)
    {
        int lunghezza=0;
        while(*p!='\0')
        {
            ++lunghezza;
            ++ p;
        }
        int l=lunghezza;
        for(int i=0;i<l;i++)
        {
            int lfirst;
            if(*(p+i)=="x")
            lfirst++;
        for(int j=0;j<lfirst;j++)
        cout<<*(p+j);
            int llast;
            if(*(p+i)=="y")
            llast++;
        for (int j=0;j<llast;j++)
        cout<<*(p+j);
    
        }
    
    
    }
    
    
  • Re: Es sui puntatori a stringhe

    Cosa ti fa credere che questa funzioni?
    
    if(*(p+i)=="x")
    ..................
    if(*(p+i)=="y")
    
    Vedo che non hai tanta voglia di imparare perche invece che far notare cosa non ti è chiaro implementi sempre soluzioni diverse.Questa per esempio è puro C e non centra niente col C++. Cmq se vuoi continuare per la tua strada sei libero di farlo.
  • Re: Es sui puntatori a stringhe

    E come si può fare?
    ho provato anche con la conversione da char a stringa ma niente il compilatore mi dà errore
    puoi scrivermi una tua versione del codice?
    così vedo dove ho sbagliato
  • Re: Es sui puntatori a stringhe

    Questa è una versione. Leggi i commenti e non dire che questo non lo imparato, quel'altro non lo voglio impararare. Se non puoi usare le funzioni find ne crei tu delle altre uguali che non è per niente dificile implementarli.
    
    #include<iostream>
    #include<string>
    using namespace std;
    
    string funzione(const string & s, size_t *pos);
    
    int main()
    {
    	//        0123456789012          
    	string s("&&&xx&&yyyy&&");
    	size_t pos = 0;
    	cout<<funzione(s,&pos) << endl;
    	cout<<funzione(s,&pos);
    	return 0;
    }
    
    string funzione(const string & s, size_t *pos)
    {
    	//trova la posizione del primo carattere non & partendo dalla posizione pos
    	//(caso prima chiamata: la ricerca viene fatto partire da pos = 0)
    	//(caso seconda chiamata: la ricerca viene fatto partire da pos = 5)
    
    	size_t startPos = s.find_first_not_of('&',*pos);
    
    	//startPost contiene la posizione del primo carattere diverso da &
    	//(caso prima chiamata contiene 3 che è la posizione del primo x)
    	//(caso seconda chiamata contiene 7 che è la posizione del primo y)
    
    
    	if(startPos != string::npos)
    	{
    		//trova la posizione del primo carattere & partendo dalla posizione startPos
    		//(caso prima chiamata: la ricerca viene fatto partire da startPos = 3)
    		//(caso seconda chiamata: la ricerca viene fatto partire da startPos = 7)
    
    		size_t endPos = s.find_first_of('&',startPos);
    
    		//endPost contiene la posizione del primo carattere uguale a &
    		//(caso prima chiamata contiene 5 che è la posizione del primo & dopo tutti gli x)
    		//(caso seconda chiamata contiene 11 che è la posizione del primo & dopo tutti gli y)
    
    
    		if(endPos != string::npos)
    		{
    			*pos = endPos;
    			//pos contiene la posizione dove è finita la prima stringa
    			//cosi quando richiamo la funzione la ricerca viene fatta partire da qui.
    
    			return s.substr(startPos,endPos - startPos);
    
    			//ritorna la stringa tra gli due indici
    			//caso prima chiamata ritorna la stringa tra 3 e 5
    			//caso seconda chiamata ritorna la stringa tra 7 e 11
    		}
    	}
    
    	//qui non si deve mai arrivare
    	return s;
    }
    
  • Re: Es sui puntatori a stringhe

    L' esercizio può anche essere risolto nel seguente modo:
    #include<iostream>
    using namespace std;
    void funzione(char*);
    
    int main()
    {
      char *p="&&&xxx&&yy&&&&";
      funzione(p);
      return 0;
    }
    
    void funzione(char *p)
    {
      int lunghezza=0;
      char *p1; 
      p1=p;
         
      while(*p!='\0') 
       {
        lunghezza++;
        p++;   
       }
      
      char *stringax = new char[lunghezza+1];
      char *stringay = new char[lunghezza+1]; 
      int i=0;     
      int j=0;
      int z=0;
      for(i=0; i<lunghezza; i++)
       {
        if(*(p1+i)=='x')
         {
           stringax[j]='x';
           j++;
           }
        
        if(*(p1+i)=='y')
         {
           stringay[z]='y';
           z++;
           }  
        }
      
       cout<<"La stringa di x e':\n"; 
       for(i=0; i<j; i++)
        cout<<stringax[i]<<",";
        cout<<"\n";
       
       cout<<"La stringa di y e':\n";
       for (i=0; i<z; i++)
        cout<<stringay[i]<<",";
    }
    
    Matteo
  • Re: Es sui puntatori a stringhe

    
    while(*p!='\0')
       {
        lunghezza++;
        p++;   
       }
    
    .......
    
    codice equivalente:
    lunghezza = strlen(p);
    
    
      char *stringax = new char[lunghezza+1];
      char *stringay = new char[lunghezza+1]; 
    
    dov'è il delete che elimina la memoria allocata? Stai usando 7 variabili temporanee quando ne bastano 2. Stai cercando della memoria al sistema per ben due volte della lunghezza massimale della stringa iniziale. Il testo parla di "restituire" due stringhe e non di chiamare la funzione void e fare un cout. Se queste stringhe fossero servite per calcoli successivi?
    Stiamo parlando di C++ non di C mixato al C++. Stiamo parlando di stringhe (C++) non di char * (C) . Certo che può essere risolto in mille modi ma bisogna rispettare anche le richieste dove una di esse è:
    x...x e y...y
    sono sequenze di uno o più caratteri, tutti diversi dal carattere &
    il che significa che non sono x e y ma possono essere anche a e b, oppure c e k giusto per elencare qualcuna.
  • Re: Es sui puntatori a stringhe

    So che poteva anche essere utilizzata la funzione strlen() invece del ciclo while, ma non sapevo se all' autore dell' esercizio era consentito usarla.
    Mi sono dimenticato di utilizzare il delete per eliminare la memoria allocata, è buona regola utilizzare anche il delete.
    Per quanto riguarda le variabili poteva ancora essere ottimizzato.
    Avevo visto che il testo parlava di restituire 2 stringhe, ma mi sono basato sulla seconda versione del programma postato dove utilizzava una funzione che ritorna void, pensando che gli andasse bene lo stesso.
    Ho utilizzato il char* perchè conosco molto meglio il C del C++, comunque è lecito utilizzare anche il char* nel C++.
    Per quanto riguarda le sequenze x....x ed y....y, le avevo interpretate come se fossero sempre sequenze di x e di y.

    Ho realizzato questo programma solo per cercare di essere di aiuto all' autore dell' esercizio.

    Matteo
  • Re: Es sui puntatori a stringhe

    Voglio proprio conoscere il suo professore. Mi sa che ha tanto da imparare.
Devi accedere o registrarti per scrivere nel forum
11 risposte