繁体   English   中英

从std :: string中提取信息

[英]Extract information from std::string

与字符串相关的查询太多,但仍存在一些疑问,因为每个字符串都不相同,每个要求也不同。

我有以下形式的单个字符串: Random1A:Random1B::String1 Random2A:Random2B::String2 ... RandomNA:RandomNB::StringN

我想以这种形式取回一个字符串: String1 String2 ... StringN

简而言之,输入字符串将类似于A:B::Val1 P:Q::Val2 ,而o / p结果字符串将类似于“ Val1 Val2 ”。

PS: RandomsStrings是小(可变)长度的字母数字字符串。

std::string GetCoreStr ( std::string inputStr, int & vSeqLen )
{
    std::string seqStr;
    std::string strNew;
    seqStr = inputStr;
    size_t firstFind = 0;
    while ( !seqStr.empty() )
    {
        firstFind = inputStr.find("::");
        size_t lastFind = (inputStr.find(" ") < inputStr.length())? inputStr.find(" ") : inputStr.length();
        strNew += inputStr.substr(firstFind+2, lastFind-firstFind-1);
        vSeqStr = inputStr.erase( 0, lastFind+1 );
    }
    vSeqLen = strNew.length();
    return strNew;
}

我想回到一个字符串String1 String2 ... StringN

我的代码有效,我可以选择结果,但这不是最佳形式。 我需要帮助来改善代码质量。

我最终以C方式完成。

std::string GetCoreStr ( const std::string & inputStr )
{
    std::string strNew;
    for ( int i = 0; i < inputStr.length(); ++i )
    {
        if ( inputStr[i] == ':' && inputStr[i + 1] == ':' )
        {
            i += 2;
            while ( ( inputStr[i] != ' ' && inputStr[i] != '\0' ) )
            {
                strNew += inputStr[i++];
            }
            if ( inputStr[i] == ' ' )
            { 
                strNew += ' ';
            }
        }
    }
return strNew;
}

我在决定如何调整偏移量时遇到了麻烦。 [...]

std::string getCoreString(std::string const& input)
{
    std::string result;
    // optional: avoid reallocations:
    result.reserve(input.length());
    // (we likely reserved too much – if you have some reliable hint how many
    // input parts we have, you might subtract appropriate number)

    size_t end = 0;
    do
    {
        size_t begin = input.find("::", end);
        // added check: double colon not found at all...
        if(begin == std::string::npos)
            break;
        // single character variant is more efficient, if you need to find just such one:
        end = std::min(input.find(' ', begin) + 1, input.length());
        result.append(input.begin() + begin + 2, input.begin() + end);
    }
    while(end < input.length());
    return result;
}

旁注:您不需要其他的“长度”输出参数; 这是多余的,因为返回的字符串包含相同的值...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM