这段C++代码调用parse_input后出现Segfault段错误,问题出在哪里?
问题根因
- 核心段错误触发点:
parse_client_days函数中调用std::transform时,输出目标days是空vector,days.begin()指向未分配的内存空间,直接写入会触发内存越界访问,导致段错误。 - 附带逻辑错误:
- 解析日期的lambda中,除了mon、tues的判断分支,其余所有分支都错误返回
Days::Tues,会导致后续断言失败 - 截取日期字符串时,
input.substr(input.find(":"))会把冒号也包含到日期输入串中,属于不规范截取
- 解析日期的lambda中,除了mon、tues的判断分支,其余所有分支都错误返回
修复方案
1. 修复transform越界问题
把std::transform的输出迭代器换成std::back_inserter(days),自动向空vector尾部插入元素,需要先引入<iterator>头文件:
// 修改transform调用语句 std::transform(days_tokens.begin(), days_tokens.end(), std::back_inserter(days), [](std::string token) {
2. 修复日期枚举返回错误
将lambda中各个分支的返回值修改为对应正确的Days枚举:
if (token.find("mon") != std::string::npos) { return Days::Mon; } else if (token.find("tues") != std::string::npos) { return Days::Tues; } else if (token.find("wed") != std::string::npos) { return Days::Wed; } else if (token.find("thur") != std::string::npos) { return Days::Thur; } else if (token.find("fri") != std::string::npos) { return Days::Fri; } else if (token.find("sat") != std::string::npos) { return Days::Sat; } else if (token.find("sun") != std::string::npos) { return Days::Sun; }
3. 优化日期字符串截取逻辑
跳过冒号避免多余前缀:
std::string client_days_input = input.substr(input.find(":") + 1);
内容的提问来源于stack exchange,提问作者naomijub
相关产品推荐
相关产品推荐

