【发布时间】:2017-10-04 21:10:55
【问题描述】:
好的,所以我正在使用 C++ 编写一个家庭作业项目,但遇到了一个问题,似乎找不到解决方法。该函数应该在用户定义的分隔符处断开输入字符串,并将子字符串存储在一个向量中以供以后访问。我想我已经弄清楚了基本的解析器,但它不想拆分输入的最后一部分。
int main() {
string input = "comma-delim-delim&delim-delim";
vector<string> result;
vector<char> delims;
delims.push_back('-');
delims.push_back('&');
int begin = 0;
for (int i = begin; i < input.length(); i++ ){
for(int j = 0; j < delims.size(); j++){
if(input.at(i) == delims.at(j)){
//Compares chars in delim vector to current char in string, and
//creates a substring from the beginning to the current position
//minus 1, to account for the current char being a delimiter.
string subString = input.substr(begin, (i - begin));
result.push_back(subString);
begin = i + 1;
}
上面的代码可以很好地分割输入代码直到最后一个破折号。之后的任何事情,因为它没有遇到另一个分隔符,所以它不会保存为子字符串并推入结果向量。因此,为了纠正这个问题,我整理了以下内容:
else if(input.at(i) == input.at(input.length())){
string subString = input.substr(begin, (input.length() - begin));
result.push_back(subString);
}
但是,我在上述部分中不断出现超出范围的错误。拆分子字符串的边界似乎存在问题,我不知道如何解决它。有什么帮助吗?
【问题讨论】:
-
我建议存储最后一次拆分发生的索引,并且在循环结束时,如果该值不是字符串的结尾,则将最后一次拆分后的所有内容推送到您的结果中。您现在拥有的内容有些可疑,因为它会考虑与要匹配的最后一个字符相同的字符(除了越界问题)。
-
您是否尝试过添加守车?即在您的字符串中附加一个分隔符。
-
所以你想使用两个分隔符
-和&? -
@DOUGLASO.MOEN 是绝对正确的。在你的循环之前添加类似
input.push_back(delims.at(0));的东西,一切都应该完美运行(见here)。相反,您也可以在循环之后使用 begin 的最后一个值再次获取子字符串(但您必须小心检查您是否已经在字符串的末尾)。
标签: c++ string parsing stdstring