我的字符串是:std :: string achRecBuff =“ usbaudio_1_req:some string”;
我要从该字符串中提取字符串,直到第二个定界符“ _”为止。 因此,提取的字符串应类似于“ usbaudio_1”。
我该怎么做?
答案 0 :(得分:1)
当第二个下划线始终与最后一个下划线相同时,一个简单的解决方案如下所示:
const auto pos = achRecBuff.find_last_of('_');
const std::string upTo2ndUnderscore = achRecBuff.substr(0, pos);
编辑:考虑到一般情况(感谢@chris指出),此代码段也可以满足您的要求:
template <class Container, class Element>
Container beforeNthMatch(const Container& c, const Element& value, unsigned n)
{
using std::cbegin;
using std::cend;
auto pos = cbegin(c);
while (n-- != 0) {
pos = std::find(++pos, cend(c), value);
if (pos == cend(c))
return {};
}
return {cbegin(c), pos};
}
在您的情况下,调用看起来像
const std::string upTo2ndUnderscore = beforeNthMatch(achRecBuff, '_', 2);
涵盖了空输入容器之类的情况,您也可以将其与其他容器一起使用,例如在std::vector<int>
中找到第n个给定的整数。
答案 1 :(得分:1)
您可以多次使用std::string::find,如下所示:
std::string extract_special_part(std::string const& s)
{
if(auto pos = s.find('_') + 1)
if((pos = s.find('_', pos)) + 1)
return s.substr(0, pos);
return {};
}
int main()
{
std::string achRecBuff = "usbaudio_1_req:some string";
std::cout << extract_special_part(achRecBuff) << '\n';
}
输出:
usbaudio_1
当您向其中添加1时,它依靠std::string::npos
的明确定义的行为将回合归零。如果找不到该字符,则if()
语句将失败,因为std::string::npos + 1
变为0
,即false
。
答案 2 :(得分:0)
#include <iostream>
int main() {
std::string a="usbaudio_1_req:some string" ;
std::string::size_type f = a.find("_") ; // find 1st pos
if ( f!=std::string::npos ) {
f=a.find("_", f+1) ; // find 2nd pos
if ( f!=std::string::npos ) {
std::string b = a.substr(0, f) ;
std::cout << b << std::endl ;
}
}
return 0 ;
}
输出为
usbaudio_1