=scott>=tiger>=mushroom>=>=abcd>="; std::str-6ren">
gpt4 book ai didi

c++ - 如何使用 C++ 拆分字符串,然后选择最后一部分?

转载 作者:行者123 更新时间:2023-11-28 04:29:02 27 4
gpt4 key购买 nike

我想拆分一个字符串,然后打印字符串的数量,并打印分隔符内的最后一个字符串?

std::string s = ">=scott>=tiger>=mushroom>=>=abcd>=";
std::string delimiter = ">=";

size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
token = s.substr(0, pos);
std::cout << token << std::endl;
s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;

我想计算字符串的数量,并像这样打印这个字符串的最后一部分我需要打印:3个abcd

最佳答案

编辑:我添加了一个最小的解决方案。


最小解决方案

假设我正确地理解了这个问题,我的做法是定义一个合适的拆分函数。由于在您的split 定义中似乎忽略了拆分空字符串,因此我希望以下拆分函数可以解决当前问题。该函数统计非空字符串的个数,最后创建最后一个非空字符串:

std::pair<std::size_t, std::string> 
check(const std::string& str, const std::string& delimiter)
{
std::size_t count = 0;
auto begin = str.begin();
auto end = str.begin();

for(auto it = str.begin();
it != str.cend();
it += ((it == str.cend()) ? 0 : delimiter.length()) )
{
const auto preit = it;
it = std::search(preit, str.cend(), delimiter.cbegin(), delimiter.cend());

if(it != preit)
{
++count;
begin = preit;
end = it;
}
}

return { count, std::string(begin, end) };
}

如下使用这个 split 函数,我们可以得到想要的输出3 abcd。

DEMO is here.

std::string s = ">=scott>=tiger>=mushroom>=>=abcd>=";
std::string delimiter = ">=";

const auto result = check(s, delimiter);
if(result.first != 0){
std::cout << (result.first - 1) << " " << result.second << std::endl;
}

一般 split 函数

如果还需要其他非空拆分字符串,最好实现更通用的拆分功能。此外,由于一般拆分函数在其他问题中会有用,因此我认为这是一个很好的机会。在上述函数 check 的 if 部分创建字符串并将其放回到 std::vector 中,我们得到一个更通用的拆分函数:

std::vector<std::string> 
split(const std::string& str, const std::string& delimiter)
{
std::vector<std::string> strings;

for(auto it = str.begin();
it != str.cend();
it += ((it == str.cend()) ? 0 : delimiter.length()) )
{
const auto preit = it;
it = std::search(preit, str.cend(), delimiter.cbegin(), delimiter.cend());

if(it != preit){
strings.emplace_back(preit, it);
}
}

return strings;
}

按如下方式使用此拆分函数,我们再次获得所需的输出 3 abcd

DEMO is here.

std::string s = ">=scott>=tiger>=mushroom>=>=abcd>=";
std::string delimiter = ">=";

const auto strings = split(s, delimiter);

if(!strings.empty()){
std::cout << (strings.size() - 1) << " " << strings.back() << std::endl;
}

C++17 和 std::string_view

此外,在 C++17 及更高版本中,std::string_view 也可用。创建 std::string_view 时,无需复制数据,这将提供一种提高性能的方法。因此,在这里我还为 std::stringstd::string_view 提出了一个可移植的通用拆分函数。使用几乎相同的 std::stringstd::string_view 构造器,即

basic_string(const charT* s, size_type n,
const Allocator& a = Allocator());

constexpr basic_string_view(const charT* str, size_type len);

, 并定义了以下具有通用引用的模板函数

template<typename C>
auto split(C&& str, const std::string& delimiter)
{
std::vector<typename std::remove_reference<C>::type> strings;

for (auto p = str.data(), end = p + str.length();
p != end;
p += ((p==end) ? 0 : delimiter.length()) )
{
const auto pre = p;
p = std::search(pre, end, delimiter.cbegin(), delimiter.cend());

if (p != pre)
{
strings.emplace_back(pre, p - pre);
}
}

return strings;
}

,我们可以用delimiter分割s,方法如下。

DEMO is here.

// std::string_view
const auto strings = split<std::string_view>(s, delimiter);

// std::string(s: lvalue reference)
const auto strings = split(s, delimiter);

// std::string(s: rvalue)
const auto strings = split(std::move(s), delimiter);

关于c++ - 如何使用 C++ 拆分字符串,然后选择最后一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53464679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com