C++字符串单词反转代码触发std::length_error错误的排查请求
字符串单词反转功能的错误排查与修正
问题详情
- 需求:实现字符串单词反转,例如输入
"This is Nice",输出"Nice is This" - 运行时抛出错误:
terminate called after throwing an instance of 'std::length_error' what(): basic_string::_M_create - 原实现代码:
string reverseWords(string s) { vector<string> v; string x=""; for(int i=0;i<s.size();i++) { if(isspace(s[i])) { v.push_back(x); x=""; v.push_back(" "); } else { x=x+s[i]; } } v.push_back(x); x=""; for(int j=v.size();j>=0;j--) x=x+v[j]; return x; }
错误根源
核心问题是vector索引越界:
vector的元素索引范围是0到v.size()-1,但原代码中反转遍历的起始值是j = v.size(),此时访问v[j]会直接访问未定义的内存区域,触发标准库的std::length_error异常。
另外还有个小问题:原代码遇到空格就直接添加空字符串和空格到vector,如果输入有连续空格,会生成多个空元素和连续空格,导致反转后结果混乱。
修正后的代码
string reverseWords(string s) { vector<string> v; string x = ""; for (int i = 0; i < s.size(); i++) { if (isspace(s[i])) { // 只有当前单词非空时,才添加到vector,避免空元素 if (!x.empty()) { v.push_back(x); x = ""; } // 避免连续添加空格,保证vector里的空格都是单独的 if (!v.empty() && v.back() != " ") { v.push_back(" "); } } else { x += s[i]; } } // 把最后一个未添加的单词加入vector if (!x.empty()) { v.push_back(x); } x = ""; // 从最后一个有效索引开始遍历,避免越界 for (int j = v.size() - 1; j >= 0; j--) { x += v[j]; } return x; }
关键修改说明
- 修复索引越界:反转遍历的起始值改为
v.size()-1,遍历到j=0为止,确保只访问vector中存在的元素。 - 优化空格处理:添加判断逻辑,避免向vector中插入空字符串和连续空格,保证输出结果的格式正确。
内容的提问来源于stack exchange,提问作者Fenrir_99
相关产品推荐
相关产品推荐

