大家好日子,
我在分解字符串时遇到了问题(“剪切”并使用了分隔符之间的字符串部分。)
到目前为止,这是我设法做的事情:
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以了解它是什么类型的字符串。
(我记得以类似的方式用更短的字符串解决这样的问题)
答案 0 :(得分:0)
您可以使用标准find()
类的string
方法。您可以阅读有关here,的更多信息,此方法将返回字符串中子字符串的第一个索引。
我假设receive_DATA
是std::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);
}