[英]split and parse string and convert into char* in c++
我在下面有幾個問題。 我僅從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;
}
為什么返回元素向量? 您已通過引用傳遞了它,而不必返回它。
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(一個在<cctype>中,另一個在<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);
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.