拆分和分析字符串,然后在C 中转换为char*

split and parse string and convert into char* in c++

本文关键字:转换 char 然后 字符串 拆分      更新时间:2023-10-16

我在下面有几个问题。我仅从stackoverflow中获取了此代码,并尝试理解。

拆分代码的工作方式是特定的:我无法理解以下代码

std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
    elems.push_back(item);

我添加了删除空间的代码,但它给了我编译错误。我已经采用了代码stackoverflow,无法弄清楚错误

split.cpp:34:88: error: no matching function for call to
‘remove_if(std::vector<std::basic_string<char> >::iterator,
std::vector<std::basic_string<char> >::iterator, <unresolved
overloaded function type>)’ split.cpp:34:88: note: candidate is: In
file included from
/linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/algorithm:63:0,
                 from split.cpp:5: /linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algo.h:1140:5:
note: template<class _FIter, class _Predicate> _FIter
std::remove_if(_FIter, _FIter, _Predicate)
/linux/depot/gcc-4.7.0/bin/../lib/gcc/x86_64-redhat-linux/4.7.0/../../../../include/c++/4.7.0/bits/stl_algo.h:1140:5:
note:   template argument deduction/substitution
failed:split.cpp:34:88: note:   couldn't deduce template parameter
‘_Predicate’

如何将vector<string>转换为char*

    #include<iostream>
    #include<string>
    #include<sstream>
    #include<vector>
    #include<algorithm>
    #include<cctype>
    using namespace std;
    std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
        std::stringstream ss(s);
        std::string item;
        while (std::getline(ss, item, delim)) {
            elems.push_back(item);
        }
        return elems;
    }
    std::vector<std::string> split(const std::string &s, char delim) {
        std::vector<std::string> elems;
        split(s, delim, elems);
        return elems;
    }
    int main()
    {
        std::vector<std::string> f_data;
        f_data.push_back("A=  99.58%");
        f_data.push_back("B= 78%");
        f_data.push_back("C= 90%");
        vector<string>::iterator t_data;
        for(t_data = f_data.begin(); t_data != f_data.end(); t_data++)
        {
            vector<string> temp_data = split(*t_data, '=');
            //temp_data.erase(std::remove_if(temp_data.begin(), temp_data.end(), std::isspace), temp_data.end());
        vector<string>::iterator data;
        for(data = temp_data.begin(); data != temp_data.end(); data++)
        {
            cout<<*data;
        }
    }
    return 0;
}

为什么您返回elems vector?您通过引用将其传递,您不必退还。

void split(const std::string &s, char delim, std::vector<std::string> &elems) {
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

当然,这看起来更好(请注意,它是按值返回的):

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    std::stringstream ss(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        elems.push_back(item);
    }
    return elems;
}

至于如何将vector<string>转换为char*,将矢量中的字符串连接起来,然后使用c_str()

有两个std :: isspace(一个in&lt; cctype>,另一个in in&lt; locale>)。另外,您应该删除空格,而不是向量中的字符串:

inline bool is_space(char c) { return std::isspace(c); }

...
for(std::vector<std::string>::iterator t = temp_data.begin(); t != temp_data.end(); ++t) {
    std::string& s = *t;
    std::remove_if(s.begin(), s.end(), is_space);
}
...