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

C++实现表达式字符串分词运行报Segmentation fault错误如何解决

错误原因分析
  • 越界访问空字符串触发段错误
    初始版本中定义std::string previous_digit;时没有初始化,是长度为0的空字符串。C++中std::string的[]运算符不会自动扩容,直接用previous_digit[i] = input[i]给空字符串的下标赋值属于非法内存访问,直接触发段错误。正确的数字拼接应该用push_back()方法或者+=运算符,会自动管理字符串内存和长度,你修改后的版本用push_back就解决了这个问题。
  • 函数缺失返回值
    初始版本的Tockenise函数声明返回vector<string>类型,但函数末尾没有写return语句返回构造好的分词列表,会导致主函数中拿到的是非法的野vector,后续遍历访问也会触发内存错误。
  • 字符串清空逻辑错误
    初始版本中你用循环把previous_digit的每个字符赋值为'N'来清空,既没有真正缩短字符串长度,还会把存储的数字替换成无效字符,就算解决了越界问题也得不到正确的分词结果。正确做法是调用std::string的clear()方法直接清空内容、重置长度为0,你修改后的版本用这个方法是对的。
  • 末尾数字未处理
    初始版本的逻辑只在遇到运算符时才把之前的数字存入分词列表,输入字符串末尾的数字(比如示例输入里的"3")后面没有运算符,循环结束后不会被加入结果列表,修改后的版本增加了i == input.size()的判断,处理了最后一段数字的存入问题。
补充优化建议

调用isdigit(input[i])时,最好把参数强转为unsigned char,即isdigit(static_cast<unsigned char>(input[i])),避免char为有符号类型且字符值为负时触发未定义行为。

内容的提问来源于stack exchange,提问作者user15032639

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:54:04