带有向量和字符串的 C++ 分段错误

Posted

技术标签:

【中文标题】带有向量和字符串的 C++ 分段错误【英文标题】:C++ Segmentation Fault with vectors and strings 【发布时间】:2014-02-22 04:17:57 【问题描述】:

我的代码的一部分出现分段错误,我已经查看并修复了我看到的大部分错误,但我找不到所有分段错误。

这段代码只是检查向量的标记中是否有单引号,并将单引号字符串组合成一个标记。

void file_parser::check_quote(vector<string> tokens)

    bool has_quote = false;
    string tmpstr;
    unsigned int FirstQuote = 0;
    unsigned int SecondQuote;
    string tmp;
    string tmpstr2;
    for (unsigned int i = 0; i <= tokens.size() - 1; i++) 
        tmp = tokens[i].c_str();
        for (unsigned int m = 0; m <= tmp.size() - 1; m++) 
            if (tmp[m] == '\'') 
                has_quote = true;
                FirstQuote = m;
            
            if (has_quote && m != FirstQuote && tmp[m] == '\'') 
                SecondQuote = m;
                for (unsigned int k = FirstQuote; k <= SecondQuote; k++) 
                    tmpstr += tokens[k];
                
                tokens.insert(tokens.begin() + FirstQuote, tmpstr);
                for (unsigned int j = FirstQuote + 1; j <= tokens.size() - 1; j++) 
                    for (unsigned int l = SecondQuote + 1; l <= tokens.size() - 1; l++) 
                        tmpstr2 = tokens[SecondQuote + 1];
                        tokens.insert(tokens.begin() + j, tmpstr2);
                    
                
                int test = tokens.size() - SecondQuote + 1;
                while (test > 0) 
                    tokens.erase(tokens.end() - 1);
                
            
        
    

【问题讨论】:

seg 故障发生在哪一行? 我看到的一般问题是您在循环矢量时更改了矢量。循环中的这种行为实际上是在乞求发生段错误。 执行此操作:tokens.insert(tokens.begin() + j, tmpstr2); 在受此限制的循环内:l &lt;= tokens.size() - 1 ... 您希望何时真正达到该限制并打破循环?您当前的问题在于您的代码,但您试图解决的 实际 问题更难以捉摸。你想做什么?为什么你认为这会做到?这只是一个报价匹配算法?这是真正的计划吗? @user3339703 - 如果您可以更详细地解释您的要求,也许有人可以建议一种更好的方法来调整您的向量。现在,看着你的代码,我的眼睛在流血。也许几个左右的 STL 算法可以代替(难以维护和调试的)循环来完成这项工作。 tmp = tokens[i].c_str(); 为什么在 tokens[i] 是 std::string 而 tmp 是 std::string 时调用 c_str()? 【参考方案1】:

问题出在你的 for 循环中。您想从 tmp 复制字符,在引号之间(包括引号),但您停止引用 tmp,并返回到标记。

【讨论】:

以上是关于带有向量和字符串的 C++ 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:核心转储 C++ 向量对字符串:

在 C++ 中比较来自向量的字符串时出现分段错误

C++ 向量分段错误

分段错误:C++ 使用 lambda 比较器对字符串向量进行排序

在 C++ 中的向量中键入所有值后出现分段错误(核心转储)

向量的 C++ 分段错误