Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C++] Questione di replace

    Sarò breve: ho la necessità di trasformare una stringa (più precisamente, un path di un file) da, per esempio, così:

    C:\utente\file.txt

    a così:

    C:\\utente\\file.txt

    Ho provato a fare una funzione che mi sostituisce una stringa x con una stringa y, ma crasha se y contiene lettere comuni con x.

    Tipo: a con ab, e, appunto, \ con \\.

    codice:
    string rep(string &a,string b,string c){
            int pos ;
        do
        {
            pos = a.find(b);
            if (pos!=-1)  a.replace(pos, b.length(), c);
        }
        while (pos!=-1);
        return a;
    }
    Qualcuno mi sa aiutare?

    Vi ringrazio anticipatamente.

  2. #2
    codice:
    //Replaces all the instances of search with replace in string; returns the number of substitutions done
    unsigned int ReplaceString(std::string & string,const std::string & search,const std::string & replace)
    {
    	unsigned int ret=0;
    	for(std::string::size_type pos=string.find(search);pos!=string.npos;ret++,pos=string.find(search,++pos))
    	{
    		if(search.length()>replace.length())
    			string.erase(pos,search.length()-replace.length());
    		if(search.length()<replace.length())
    			string.insert(pos,replace.length()-search.length(),' ');
    		string.replace(pos,replace.length(),replace);
    	}
    	return ret;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Originariamente inviato da MItaly
    codice:
    //Replaces all the instances of search with replace in string; returns the number of substitutions done
    unsigned int ReplaceString(std::string & string,const std::string & search,const std::string & replace)
    {
    	unsigned int ret=0;
    	for(std::string::size_type pos=string.find(search);pos!=string.npos;ret++,pos=string.find(search,++pos))
    	{
    		if(search.length()>replace.length())
    			string.erase(pos,search.length()-replace.length());
    		if(search.length()<replace.length())
    			string.insert(pos,replace.length()-search.length(),' ');
    		string.replace(pos,replace.length(),replace);
    	}
    	return ret;
    }
    Ti ringrazio infinitamente, ma ho ancora un problema.
    La funzione che mi hai postato funziona in tutti i casi, tranne nel modo in cui serve a me, ossia convertire i backslash con doppi backslash.

    Per esempio, ho tmp che vale "aaa\\bb\\cc" (aaa\bb\cc) e deve diventare "aaaa\\\\bb\\\\cc" (aaaa\\bb\\cc), ma il programma va in crash.

    codice:
    string tmp = "aaaa\\bb\\cc";
    ReplaceString(tmp, "\\", "\\\\");
    Sbaglio qualcosa?

    Grazie ancora.

  4. #4
    E pensare che da quando l'ho scritta ho sempre usato questa funzione senza mai accorgermi dell'errore... non la usavo mai sostituendo una stringa con un'altra che la contiene...
    codice:
    //Replaces all the instances of search with replace in string; returns the number of substitutions done
    unsigned int ReplaceString(std::string & string,const std::string & search,const std::string & replace)
    {
    	unsigned int ret=0;
    	for(std::string::size_type pos=string.find(search);pos!=string.npos;ret++,pos=string.find(search,++pos))
    	{
    		if(search.length()>replace.length())
    			string.erase(pos,search.length()-replace.length());
    		if(search.length()<replace.length())
    			string.insert(pos,replace.length()-search.length(),' ');
    		string.replace(pos,replace.length(),replace);
    		pos+=replace.length();
    	}
    	return ret;
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Originariamente inviato da MItaly
    E pensare che da quando l'ho scritta ho sempre usato questa funzione senza mai accorgermi dell'errore... non la usavo mai sostituendo una stringa con un'altra che la contiene...
    codice:
    //Replaces all the instances of search with replace in string; returns the number of substitutions done
    unsigned int ReplaceString(std::string & string,const std::string & search,const std::string & replace)
    {
    	unsigned int ret=0;
    	for(std::string::size_type pos=string.find(search);pos!=string.npos;ret++,pos=string.find(search,++pos))
    	{
    		if(search.length()>replace.length())
    			string.erase(pos,search.length()-replace.length());
    		if(search.length()<replace.length())
    			string.insert(pos,replace.length()-search.length(),' ');
    		string.replace(pos,replace.length(),replace);
    		pos+=replace.length();
    	}
    	return ret;
    }
    Grande! Grazie davvero.

  6. #6
    Di niente; alla prossima!
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Originariamente inviato da MItaly
    codice:
    //Replaces all the instances of search with replace in string; returns the number of substitutions done
    unsigned int ReplaceString(std::string & string,const std::string & search,const std::string & replace)
    {
    	unsigned int ret=0;
    	for(std::string::size_type pos=string.find(search);pos!=string.npos;ret++,pos=string.find(search,++pos))
    	{
    		if(search.length()>replace.length())
    			string.erase(pos,search.length()-replace.length());
    		if(search.length()<replace.length())
    			string.insert(pos,replace.length()-search.length(),' ');
    		string.replace(pos,replace.length(),replace);
    		pos+=replace.length();
    	}
    	return ret;
    }
    A cosa serve usare erase e insert, prima del replace ? Mi sfugge qualcosa ? :master:
    Io uso questo codice:
    codice:
    int buffReplace(       std::string &buffer,
                     const std::string &strFind,
                     const std::string &strRepl )
    {
       int    count = 0;
       size_t pos   = 0;
       if( 0==buffer.size()
    	 || 0==strFind.size() )
    		return -1;
       while(( pos = buffer.find( strFind, pos ))!=std::string::npos )
       {
    		buffer.replace( pos, strFind.size(), strRepl.c_str() );
    		pos += strRepl.size();
    		count++;
       }
       return count;
    }
    Magari troviamo un baco anche nel mio codice

  8. #8
    Hai ragione, probabilmente erano dei rimasugli di una qualche vecchia versione della funzione che funzionava in maniera differente.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.