C++ return array of strings from a function
我正在研究一个简单的csv解析器。
从我的csv文件中,我得到第一行作为字符串,比如:
1 | "117;'Tom';'Sawyer';"; |
我要实现的是一个将字符串拆分为多个部分的函数,类似于php的explode:
1 2 3 | $string ="117;'Tom';'Sawyer';"; $row = explode(";", $string); echo $row[0]; |
我需要一个函数来返回行变量中的字符串数组。
我是新的C++,所以我不知道什么寻找或使用。
似乎您正在寻找一个函数,该函数使用一些指定的分隔符拆分字符串,并将它们放入顺序容器中。
下面是一个函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #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,我建议你这样做。使用boost.string_algo库,其中包含用于特定目的的split函数(示例用法)。
这是一个很常见的问题,如果您搜索它,您可以相对轻松地找到它。以下是一些可能有帮助的信息:
https://stackoverflow.com/a/236803/1974937