Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从字符串序列中提取最后2个单词,空格分隔_C++_Algorithm_String_Stl_Tokenize - Fatal编程技术网

C++ 从字符串序列中提取最后2个单词,空格分隔

C++ 从字符串序列中提取最后2个单词,空格分隔,c++,algorithm,string,stl,tokenize,C++,Algorithm,String,Stl,Tokenize,我有任何序列(或句子),我想提取最后2个字符串 比如说, sdfsdfds sdfs dfsd fgsd 3 DSFD应生成:3 DSFD sdfsd(dfgdg)gfdg fg 6 gg应产生:6 gg 如果字符串是以空格分隔的,则以下命令将起作用 #include <iostream> #include <string> #include <sstream> #include <vector> using namespace std; in

我有任何序列(或句子),我想提取最后2个字符串

比如说,

  • sdfsdfds sdfs dfsd fgsd 3 DSFD应生成:
    3 DSFD
  • sdfsd(dfgdg)gfdg fg 6 gg应产生:
    6 gg

如果字符串是以空格分隔的,则以下命令将起作用

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
using namespace std;

int main()
{
    string str = "jfdf fhfeif shfowejef dhfojfe";
    stringstream sstr(str);
    vector<string> vstr;

    while(sstr >> str)
    {
        vstr.push_back(str);
    }

    if (vstr.size() >= 2)
        cout << vstr[vstr.size()-2] << ' ';
    if (vstr.size())
        cout << vstr[vstr.size()-1] << endl;

    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
string str=“jfdf fhfeif shfowejef dhfojfe”;
stringstream sstr(str);
矢量vstr;
while(sstr>>str)
{
vstr.推回(str);
}
如果(vstr.size()>=2)
cout您可以使用函数来查找空间

int main()
{
    std::string test = "sdfsdfds sdfs dfsd fgsd 3 dsfds";

    size_t found1 = test.find_last_of( " " );
    if ( found1 != string::npos ) {
        size_t found2 = test.find_last_of( " ", found1-1 );
        if ( found2 != string::npos ) 
            std::cout << test.substr(found2+1, found1-found2-1) << std::endl;
        std::cout << test.substr(found1+1) << std::endl;
    }

    return 0;
}
intmain()
{
std::string test=“sdfsdfds sdfs dfsd fgsd 3 dsfds”;
size\t found1=测试。查找(“”)的最后一个;
if(found1!=字符串::npos){
size\u t found2=测试。查找(“”,found1-1)中的最后一个;
if(found2!=字符串::npos)

std::cout以错误的顺序返回字符串,但如果这不重要

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); 
}  

我鼓励您看看Boost库。它的算法和数据结构对您有很大帮助。以下是如何使用以下方法解决您的问题:

#包括
#包括
#包括
#包括
int main()
{
std::string test=“sdfsdfds sdfs dfsd fgsd 3 dsfds”;
std::向量v;
boost::algorithm::split(v,test,[](char c){return c=='';});
std::cout
int main()
{
std::string test=“sdfsdfds sdfs dfsd fgsd 3 dsfds”;
尺寸=测试长度();
对于(int i=0;i<2;i++)
pos=测试。找到(“”,pos-1)中的最后一个;

std::看不到这个问题:。另外,这与STL(STL是处理容器、迭代器和算法的std库的一部分)关系不大,所以我更改了标记。@sbi:std::string及其查找方法(在本例中rfind很有用)是STL的一部分。所以我不想删除STL标记。@Vlad:“STL”是std库中那些部分的通俗名称,它们来自原始STL。人们可能会争论,STL出现时,标准草案中很长一段时间都没有提到的
std::string
(问题中甚至没有提到),后来才被“STL化”,它是否属于STL。它的无数成员函数肯定不属于STL。(毕竟,算法与容器是分开的这一事实是将STL区分开来的原因。)我不会为该标记争论,但它是错误的。在访问它之前,您可能希望检查向量的大小是否大于2。是的,谢谢。我假设有足够的字符串用于提取。@Donato:(你需要正确地@address comment responses,以便它们显示在“其他人的回复”选项卡中。我只是偶然来到这里。)现在投票了。@sbi,不知道这个功能。谢谢。我认为它是自动的。
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;
}
#include <boost/algorithm/string/split.hpp>
#include <iostream>
#include <vector>
#include <string>

int main()
{
   std::string test = "sdfsdfds sdfs dfsd fgsd 3 dsfds";

   std::vector<std::string> v;
   boost::algorithm::split(v, test, [](char c) { return c==' ';});
   std::cout << "Second to last: " << v.at(v.size()-2) << std::endl;
   std::cout << "Last:           " << v.at(v.size()-1) << std::endl;
}
int main()
{
     std::string test = "sdfsdfds sdfs dfsd fgsd 3 dsfds";
     size_t pos = test.length();
     for (int i=0; i < 2; i++)
         pos = test.find_last_of(" ", pos-1);
     std::cout << test.substr(pos+1) << std::endl;
 }