在分隔符之间获取字符串

时间:2016-03-01 15:35:08

标签: c++ string delimiter

大家好日子,

我在分解字符串时遇到了问题(“剪切”并使用了分隔符之间的字符串部分。)

到目前为止,这是我设法做的事情:

    std::string begin_processed_received_DATA = "&7?@670*/5#^";
    std::string end_processed_received_DATA = "*8d4a#%";

    processed_received_DATA = receive_DATA;

    //Checks if delimiter exists in message (by setting NO_DELIMITER to represent number where END DELMITER is in string array)
    std::size_t NO_DELIMITER = processed_received_DATA.find(end_processed_received_DATA);

    if (NO_DELIMITER != std::string::npos) {
        //Deletes string from end
        processed_received_DATA.resize(processed_received_DATA.find(end_processed_received_DATA));

        //Deletes string from begining (starting at string[0])
        processed_received_DATA.erase(0, processed_received_DATA.find(begin_processed_received_DATA) + begin_processed_received_DATA.size());
    }

    else {
        return 201502;
    }

有没有人有任何想法我应该如何处理这个问题?

示例receive_DATA将是这样的:984GE#$% 534'694 4685)_(9357uf0 di,stre89/4&7?@670*/5#^nulter.dd/se 895/68.476*8d4a#%897 R#3t746+- @1

我必须通知我的receive_DATA字符串包含许多符号,数字,空格,字母,长度约为20000个符号。 这是picture以了解它是什么类型的字符串。 (我记得以类似的方式用更短的字符串解决这样的问题)

2 个答案:

答案 0 :(得分:0)

您可以使用标准find()类的string方法。您可以阅读有关here,的更多信息,此方法将返回字符串中子字符串的第一个索引。

我假设receive_DATAstd::string,因为它未在您的代码示例中明确声明。

您要做的是首先找到您的分隔符的位置:

size_t dataBegin = receive_DATA.find(begin_proccessed_received_DATA) + 
                                    begin_proccessed_received_DATA.length();
string dataAfterFirstDelim;

size_t dataEnd;
if (dataBegin != string::npos)
{
    dataAfterFirstDelim = receive_DATA.substr(dataBegin, 
                                                     receive_DATA.length() - dataBegin);
    dataEnd = dataAfterFirstDelim.find(end_proccessed_received_DATA);

}

请注意,您必须将第一个分隔符的长度添加到该分隔符的起始位置,以查找数据的开头。从那里你只需要在数据开始之后(由@SergeBallesta指出)搜索第二个分隔符。

当您知道字符串中出现的位置时,您可以使用substr方法轻松找到它们之间的子字符串,该方法采用起始位置和长度。由于您现在有一个以数据开头的字符串,您可以从其开头到数据的结束点执行子字符串。

if (dataBegin != string::npos && dataEnd != string::npos)
{
    processed_received_DATA = dataAfterFirstDelim.substr(0, dataEnd);
}

答案 1 :(得分:0)

std::string find_delimited(const std::string& data,
        const std::string& begin_delimiter,
        const std::string& end_delimiter) {
    std::size_t begin = data.find(begin_delimiter);
    if (begin == std::string::npos)
        // error: begin_delimiter not found
    begin += begin_delimiter.size();
    std::size_t end = data.find(end_delimiter, start;
    if (end == std::string::npos) 
        // error: end_delimiter not found
    return data.substr(begin, end - begin);
}