带有向量和字符串的 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 <= tokens.size() - 1
... 您希望何时真正达到该限制并打破循环?您当前的问题在于您的代码,但您试图解决的 实际 问题更难以捉摸。你想做什么?为什么你认为这会做到?这只是一个报价匹配算法?这是真正的计划吗?
@user3339703 - 如果您可以更详细地解释您的要求,也许有人可以建议一种更好的方法来调整您的向量。现在,看着你的代码,我的眼睛在流血。也许几个左右的 STL 算法可以代替(难以维护和调试的)循环来完成这项工作。
tmp = tokens[i].c_str();
为什么在 tokens[i] 是 std::string 而 tmp 是 std::string 时调用 c_str()?
【参考方案1】:
问题出在你的 for 循环中。您想从 tmp 复制字符,在引号之间(包括引号),但您停止引用 tmp,并返回到标记。
【讨论】:
以上是关于带有向量和字符串的 C++ 分段错误的主要内容,如果未能解决你的问题,请参考以下文章