Renvoie les chaînes dans le mauvais ordre, mais si cela n'a pas d'importance,
std::string s ("some words here");
std::string::size_type j;
for(int i=0; i<2; ++i) {
if((j = s.find_last_of(' ')) == std::string::npos) {
// there aren't two strings, throw, return, or do something else
return 0;
}
std::cout << s.c_str()+j+1;
s = " " + s.substr(0,j);
}
Alternativement,
struct extract_two_words {
friend std::istream& operator>> (std::istream& in , extract_two_words& etw);
std::string word1;
std::string word2;
};
std::istream& operator>> (std::istream& in , extract_two_words& etw) {
std::string str1, str2;
while(in) {
in >> str1;
in >> str2;
}
etw.word2 = str1;
etw.word1 = str2;
}
Voir aussi cette question: http://stackoverflow.com/questions/53849/how-do-i-tokenize-a-string-in-c. En outre, cela a peu à voir avec la STL (qui est la partie de la bibliothèque std traitant des conteneurs, des itérateurs et des algorithmes), donc j'ai changé les tags. – sbi
@sbi: std :: string et ses méthodes find (rfind est utile dans ce cas) font partie de STL. Donc je préférerais ne pas enlever le tag STL. –
@Vlad: "The STL" est un nom familier pour les parties de la lib std, qui proviennent de la STL d'origine. [Ce n'est pas un synonyme de la bibliothèque standard.] (Http://en.wikipedia.org/wiki/Standard_Template_Library) On pourrait se demander si 'std :: string' (même pas mentionné dans la question), qui était dans le projet de norme pendant une longue période lorsque le STL est venu et a été seulement plus tard "STLified", appartient à la STL. Ce ne sont pas des myriades de fonctions membres. (Le fait que les algorithmes soient séparés des conteneurs est ce qui distingue le STL, après tout.) Je ne me battrai pas sur cette étiquette, mais c'est faux. – sbi