c + +从功能
问题描述:
我一个简单的CSV解析器工作返回一个字符串数组。c + +从功能
从我的csv文件,我得到第一排为一个字符串,比方说:
"117;'Tom';'Sawyer';";
我想实现的是打破我的字符串成片PHP的功能,类似的爆炸:
$string = "117;'Tom';'Sawyer';";
$row = explode(";", $string);
echo $row[0];
我需要将返回一个字符串数组中的行变量的函数。
我新的C++,所以我不确定如何寻找或使用。
答
好像你正在寻找使用一些指定的分隔符,并把它们顺序容器分割字符串的函数。
这里是做一个函数:
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
/// Splits the string using provided delimiters and puts the pieces into a container.
/// The container must provide push_back and clear methods.
/// @param a The contaner to put the resulting substrings into
/// @param str The string to operate on
/// @param delims Characters that are to be treated as delimiters
/// @param compress_delims If set to true, will treat mutiple sequential delimiters as a single one
template<class StringType, class ContainerType>
void split_string(ContainerType& a, const StringType& str, const StringType& delims, bool compress_delims = true)
{
typename StringType::size_type search_from = 0; // Place to start looking for delimiters
typename StringType::size_type next_delim; // Location of the next delimiter
a.clear(); // Wipe out previous contents of the output container (it must be empty if the input string is empty)
// Find the first delim after search_from,
// add the substring between search_from and delimiter location to container,
// update search_from to delimiter location + 1 so that next time we search,
// we encounter the next delimiter. Repeat until we find the last delimiter.
while((next_delim = str.find_first_of(delims, search_from)) != StringType::npos) {
// If we encounter multiple delimiters in a row and compress_delims is true
// treat it as a single delim.
if(!(compress_delims && next_delim - search_from <= 1)){
StringType token = str.substr(search_from, next_delim - search_from);
a.push_back(token);
}
search_from = next_delim + 1;
}
// If we found the last delimiter and there are still some chars after it,
// just add them to the container.
if(search_from < str.length())
a.push_back(str.substr(search_from));
}
int main()
{
std::vector<std::string> container;
std::string str = " hello so long good bye hurray ";
split_string(container, str, std::string(" "));
std::copy(container.begin(), container.end(), std::ostream_iterator<std::string>(std::cout, ","));
std::cout << " (" << container.size() << ")" << std::endl;
return 0;
}
但是,如果有可能在你的项目中使用升压,我建议你这样做。使用boost.string_algo library,其中包含split function用于该特定用途(example usage)。
的可能重复的[是否有在PHP的爆炸()函数的C++的等效?](http://*.com/questions/12966957/is-there-an-equivalent-in-c-of-phps-爆炸功能) – 2013-04-03 18:48:23
http://*.com/questions/236129/splitting-a-string-in-c的潜在重复 – 2013-04-03 18:48:38