You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

这段C++代码调用parse_input后出现Segfault段错误,问题出在哪里?

问题根因

  • 核心段错误触发点:parse_client_days函数中调用std::transform时,输出目标days是空vector,days.begin()指向未分配的内存空间,直接写入会触发内存越界访问,导致段错误。
  • 附带逻辑错误:
    • 解析日期的lambda中,除了mon、tues的判断分支,其余所有分支都错误返回Days::Tues,会导致后续断言失败
    • 截取日期字符串时,input.substr(input.find(":"))会把冒号也包含到日期输入串中,属于不规范截取

修复方案

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 10:15:04