C++;字符串分析器问题 >好,所以我正在做一个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; }

C++;字符串分析器问题 >好,所以我正在做一个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; },c++,string,parsing,stdstring,C++,String,Parsing,Stdstring,然而,我在上面的部分中不断出现越界错误。它似乎在分割子字符串的边界方面存在问题,我不知道如何绕过它。有什么帮助吗?在代码中,您必须记住.size()将比上一个索引多1,因为它从0开始。因此,大小为1的数组在[0]处建立索引。因此,如果您执行input.at(input.length())操作,它将始终溢出1位。最后一个元素是input.at(input.length()-1)。下面是一个对我有用的例子。循环结束后,抓住最后一根绳子 if(begin != input.length()){

然而,我在上面的部分中不断出现越界错误。它似乎在分割子字符串的边界方面存在问题,我不知道如何绕过它。有什么帮助吗?

在代码中,您必须记住.size()将比上一个索引多1,因为它从0开始。因此,大小为1的数组在[0]处建立索引。因此,如果您执行input.at(input.length())操作,它将始终溢出1位。最后一个元素是input.at(input.length()-1)。下面是一个对我有用的例子。循环结束后,抓住最后一根绳子

if(begin != input.length()){
    string subString = input.substr(begin,(input.length()-begin));
    result.push_back(subString);
}

从问题中的代码开始,我替换了迭代器,以便我们可以检查输入的
end()

int main() {
    string input = "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    auto begin = input.begin(); // use iterator

    for(auto ii = input.begin(); ii <= input.end(); ii++){
        for(auto j : delims) {
            if(ii == input.end() || *ii == j){
                string subString(begin,ii); // can construct string from iterators, of if ii is at end
                result.push_back(subString);
                if(ii != input.end())
                    begin = ii + 1;
                else
                    goto done;
            }
        }
    }
done:
    return 0;
}
intmain(){
字符串输入=“逗号delim-delim&delim-delim”;
矢量结果;
向量delims;
delims.推回('-');
delims.推回('&');
自动开始=输入。开始();//使用迭代器

对于(auto ii=input.begin();ii此程序使用
std::find_first_of
解析多个分隔符:

int main() {
    string input = "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    auto begin = input.begin(); // use iterator

    for(;;) {
        auto next = find_first_of(begin, input.end(), delims.begin(), delims.end());
        string subString(begin, next); // can construct string from iterators
        result.push_back(subString);
        if(next == input.end())
            break;
        begin = next + 1;
    }
}
intmain(){
字符串输入=“逗号delim-delim&delim-delim”;
矢量结果;
向量delims;
delims.推回('-');
delims.推回('&');
自动开始=输入。开始();//使用迭代器
对于(;;){
auto next=find_first_of(begin,input.end(),delims.begin(),delims.end());
字符串子字符串(begin,next);//可以从迭代器构造字符串
结果。推回(子字符串);
if(next==input.end())
打破
开始=下一个+1;
}
}

<>代码>我建议存储最后一个分割发生的索引,在循环结束时,如果该值不是字符串的末尾,在最后一次分割之后将所有的结果推到结果。现在您有点怀疑,因为它将考虑与最后一个字符匹配的任何字符。(除了越界问题之外)。您是否尝试过添加守车?例如,在字符串中添加分隔符。因此,您希望在循环之前使用两个分隔符
-
&
?@DOUGLASO.MOEN是绝对正确的。添加类似
输入的内容。向后推(delims.at(0));
,一切都应该正常工作(请参见)。相反,您也可以在循环结束后使用begin的最后一个值再次获取子字符串(但必须小心检查是否已经在字符串末尾)。为什么您决定使用而不是简单的
中断
?@scohe001
中断
只会从内部
for
循环中退出,而外部循环实际上进入
结束()
这意味着
ii++
将不被允许。啊,我的错,我看到了goto并获得了隧道视力。虽然会有一个标志吗?@scohe001这可能无法通过代码审查,但
goto
树的果实是如此甜美…非常有魅力!谢谢你的帮助。
int main() {
    string input = "comma-delim-delim&delim-delim";
    vector<string> result;
    vector<char> delims;
    delims.push_back('-');
    delims.push_back('&');
    auto begin = input.begin(); // use iterator

    for(;;) {
        auto next = find_first_of(begin, input.end(), delims.begin(), delims.end());
        string subString(begin, next); // can construct string from iterators
        result.push_back(subString);
        if(next == input.end())
            break;
        begin = next + 1;
    }
}