Sostituzione sottostringa in array

di il
11 risposte

Sostituzione sottostringa in array

Il programma è il seguente
Dato un array di stringhe(esempio {"Ciao pippo" , "pluto" , "auto" } e due stringhe s1="pippo" e s2="topolino" scrivere una procedura che trova una stringa e la sostituisce
ad esempio "Ciao pippo" diventa "Ciao topolino"
ecco qui il codice sbagliato
ma non riesco a capire dove risieda l'errore


#include<iostream>
#include<string>
using namespace std;
bool sottostringa(string , string, int& );
void find_and_replace(string [], int, string, string );
int i=0;
int main()
{
string a[]={"Ciao pippo","pluto","auto"};
string s1;
string s2;
int dim=3;
find_and_replace(a,dim,s1,s2);
if(sottostringa)
cout<<a<<endl<<endl;
else
cout<<"Non è verificato"<<endl<<endl;

return 0;
}

bool sottostringa(string s1, string s2, int& pos)
{
bool substring=false;
i=0;
int l1=s1.length();
int l2=s2.length();
pos=0;
while(i<=(l1-l2) && !substring)
if(s1.substr(i,l2)==s2)
{
substring=true;
pos=i;
}
else
i++;

return substring;
}

void find_and_replace(string a[], int dim, string s1, string s2)
{
int pos;
for(i=0;i<dim;i++)
if(sottostringa(a,s1,pos))
a=a.substr(0,pos)+s2+a.substr(pos+s1.length(),a.length()-(pos+s1.length()));
}

11 Risposte

  • Re: Sostituzione sottostringa in array

    IMPARA AD USARE I TAG CODE. PUNTO 4 DEL REGOLAMENTO.

    4. Formattare il codice sorgente
    Visto gli argomenti trattati in questo forum vengono spesso inseriti stralci di codice sorgente.
    Per rendere facilmente leggibile tale codice bisogna formattarlo utilizzando il pulsante "Code".

    Impara ad usare string.replace()
    http://www.cplusplus.com/reference/string/string/replace/
  • Re: Sostituzione sottostringa in array

    Le due funzioni sottostringa e find and replace sono perfette.
  • Re: Sostituzione sottostringa in array

    IL problema sta nel mai che hai creato :
    inanzitutto se devi sostituire ad una stringa del vettore un altra stringa queste stringhe le dovrai leggere altrimenti nel main la chiamata find_and_replace(a,dim,s1,s2) nn produrrà risultati.
    Seconda cosa una volta che la funzione "find_and_replace" ha operato c'è il nuovo vettore ma lo devi stampare con un ciclo for!
  • Re: Sostituzione sottostringa in array

    Detto tutto ciò con le modifiche che ti ho detto il programma funziona :
    
    #include<iostream>
    #include<string>
    using namespace std;
    bool sottostringa(string , string, int& );
    void find_and_replace(string [], int, string, string );
    const int dimm=3;
    int i=0;
    int main()
    {
    string x[]={"Ciao pippo","pluto","auto"};
    string ss1="pluto";
    string ss2="topolino";
    
    find_and_replace(x,dimm,ss1,ss2);
    cout<<"il nuovo vettore e'"<<endl;
    for(int h=0;h<dimm;h++)
    {
        cout<<endl;
        cout<<x[h];
    }
    
    return 0;
    }
    
    bool sottostringa(string s1, string s2, int& pos)
    {
    bool substring=false;
    i=0;
    int l1=s1.length();
    int l2=s2.length();
    pos=0;
    while(i<=(l1-l2) && !substring)
    if(s1.substr(i,l2)==s2)
    {
    substring=true;
    pos=i;
    }
    else
    i++;
    
    return substring;
    }
    
    void find_and_replace(string a[], int dim, string s1, string s2)
    {
    int i,pos;
    for(i=0;i<dim;i++)
    if(sottostringa(a[i],s1,pos))
    a[i]=a[i].substr(0,pos)+s2+a[i].substr(pos+s1.length(),a[i].length()-(pos+s1.length()));
    }
    
  • Re: Sostituzione sottostringa in array

    Quoto skynet.
    Senza il tag code non si capisce niente!!!
  • Re: Sostituzione sottostringa in array

    Il codice come dovrebbe essere scritto. Imparate a usare le funzioni che le classi vi mettono a disposizione. Sono fatte meglio (di tutti noi messi insieme), sono infallibili e molto + veloci.
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    void find_and_replace(vector<string> & v, const string &, const string &);
    
    int main()
    {
    	vector<string> x;
    	x.push_back("Ciao pippo");
    	x.push_back("pluto");
    	x.push_back("auto");
    
    
    	string ss1("pippo");
    	string ss2("topolino");
    
    	find_and_replace(x,ss1,ss2);
    
    	cout<<"il nuovo vettore e\'"<<endl;
    
    	copy(x.begin(),x.end(),ostream_iterator<string>(cout, "\n"));
    	
    	return 0;
    }
    
    void find_and_replace(vector<string> & v, const string & s1, const string & s2)
    {
    	for(vector<string>::iterator it = v.begin(); it != v.end(); ++it)
    	{
    		size_t pos = it->find(s1);
    		if(pos != string::npos)
    		{
    			it->replace(pos,s1.length(),s2);
    		}
    	}
    }
    
  • Re: Sostituzione sottostringa in array

    Guarda però c'è un problema
    che se devo sostituire una parola di un'espressione come nel nostro caso "Ciao pippo" è composta da due parole "Ciao" e "pippo" non me lo fa
    cioè mi dovrebbe stampare ciao topolino e invece ristampa ciao pippo
    bisogna forse usare il getline da qualche parte osi usa solo per input da tastiera
    insomma come si fa a risolvere questo problema?
  • Re: Sostituzione sottostringa in array

    Sei sicuro che non funziona?
    prova.jpg
    prova.jpg

  • Re: Sostituzione sottostringa in array

    Ma io ho usato quell'altro di codice
    il tuo non ho potuto poichè il vector e altre cose non le ho usate
  • Re: Sostituzione sottostringa in array

    Anche se non hai usato il vector puoi usare le funzioni find e replace della classe string. una riga e hai risolto.
    
    string s = "ciao pippo";
    string s1 = "pippo";
    string s2 = "topolino";
    
    size_t pos = s.find(s1);
    
    //pos = alla posizione dove ha trovato la stringa s1 in s, quindi punta alla lettera p subito dopo lo spazio. altrimenti se non l'ha trovato punta alla posizione virtuale npos della classe stringa. per quello che c'è quel if(pos != string::npos)
    Una volta trovato la posizione la funzione replace fa il resto.
    
    s.replace(pos,s1.length(),s2);
    
    praticamente sto codice dice alla stringa s di eliminare dei caratteri partendo dalla posizione pos, quant'è la lunghezza del s1 e di inserire al loro posto la stringa s2. Da notare che viene inserita TUTTA la stringa s2 quindi la stringa s si ingrandisce/riduce di conseguenza.
    
    Una riga di codice fa tutto.
  • Re: Sostituzione sottostringa in array

    Ecco il tuo programma senza il vector
    
        #include <iostream>
        #include <string>
    
        using namespace std;
    
        void find_and_replace(string [], const string &, const string &);
    
        int main()
        {
           string x[3] = {"Ciao pippo","pluto","auto"};
    
    
           string ss1("pippo");
           string ss2("topolino");
    
           find_and_replace(x,ss1,ss2);
    
           cout<<"il nuovo vettore e\'"<<endl;
    
           for(int it = 0; it < 3; ++it)
           {
               cout << x[it] << endl;
           }
           return 0;
        }
    
        void find_and_replace(string v[3], const string & s1, const string & s2)
        {
           for(int it = 0; it < 3; ++it)
           {
              size_t pos = v[it].find(s1);
              if(pos != string::npos)
              {
                 v[it].replace(pos,s1.length(),s2);
              }
           }
        }
    
Devi accedere o registrarti per scrivere nel forum
11 risposte