2012-03-12 5 views
0

Je souhaite remplacer une chaîne dans une chaîne de caractères. Je veux dire, j'ai une chaîne de vecteurs, définir le vecteur tmpback, avec des informations comme ceci: nom_nom_de_nom_phonenumberRemplacer une chaîne dans une chaîne de caractères

Je veux remplacer certains noms de famille. Par exemple, si quelqu'un est john_smith_5551234, je veux remplacer smith par smith100.

ceci est mon code, o partie:

vector<string> tmpback = names; 
for (Int_t i = 0; i < tmpback.size(); i++) { 
    replace(tmpback[i].begin(),tmpback[i].end(),"smith", "smith"+number); 
} 

(i nombre défini précédemment comme nombre Int_t = 0 et donner des valeurs plus tard). Est-ce que quelqu'un avait une idée de ce que je fais mal?

Merci

+1

'remplacer (..., tmpback [i] .end(), ...);' – perreal

+0

Désolé, faute de frappe erreur – Alejandro

+0

S'il vous plaît montrer la définition de 'number', est un std :: string ? –

Répondre

0

Ma réaction immédiate serait de se demander pourquoi vous vous mettez dans cette situation du tout. Au lieu de brouiller trois éléments séparés en une chaîne, puis manipuler des morceaux de cette chaîne, pourquoi ne pas créer une structure pour pouvoir travailler avec chaque pièce séparément?

struct person { 
    std::string first_name; 
    std::string last_name; 
    int record_no; 
    std::string phone_number; 
}; 

De cette façon, au lieu de vireur le numéro d'enregistrement (ou quoi exactement votre « 100 » représente) sur la fin du nom, vous donne juste son propre champ, et d'écrire un nombre approprié selon les besoins:

vector<person> tmpback; 

for (int i=0; i<tmpback.size(); i++) 
    tmpback[i].record_no = number; 
+0

merci pour la réponse @Jerry. En fait, je ne fais que modifier le code de quelqu'un. Mais, oui, cela semble plus raisonnable. Je vais essayer. – Alejandro

1

std::replace ne remplace pas de séquences avec d'autres séquences. Il remplace les éléments simples par d'autres éléments simples. En outre, votre méthode d'ajout d'un nombre à une chaîne ne fonctionne pas.

Essayez boost::replace_first ou boost::replace_all avec soit boost::lexical_cast ou std::to_string (C++ 11 seulement) pour convertir un nombre à une chaîne.

using namespace boost; 
std::string replace_str = std::string("smith") + lexical_cast<std::string>(number); 
replace_first(tmpback[i], "smith", replace_str); 

Vous pouvez également rechercher la sous-chaîne, et si vous le trouvez, insérer le numéro (converti en une chaîne) après:

std::string::size_type pos = tmpback[i].find("smith"); 
if (pos != std::string::npos) 
{ 
    // adding 5 because that's the length of "smith" 
    tmpback[i].insert(pos + 5, std::to_string(number)); 
} 
+0

merci pour votre aide @Benjamin, j'ai eu cette erreur:' Erreur: Symbol lexical_cast n'est pas défini dans les noms de portée actuelle.C: 400: Erreur : La chaîne de symboles n'est pas définie dans la portée actuelle'. La ligne 400 est votre deuxième ligne. – Alejandro

+0

@Alejandro: 'lexical_cast' vient de boost, comme le suggère le lien que j'ai fourni. Pour utiliser cette méthode, vous devez d'abord installer boost, et vous devez inclure ''. Si vous êtes impatient, il existe d'autres méthodes que vous pouvez utiliser pour convertir un nombre en une chaîne disponible dans la bibliothèque standard. Essayez d'abord 'std :: to_string', mais comme je l'ai dit, c'est uniquement disponible en mode C++ 11. Si cela ne fonctionne pas, alors vous devrez recourir à des chaînes de caractères, qui sont un peu lourdes. –

Questions connexes