编译成功但触发Debug Assertion Failed,字符串反转问题求助
问题:字符串词序反转程序触发Debug Assertion Failed
需求:实现不改变单词内部顺序的前提下反转字符串的整体词序,例如将"I am a student"转换为"student a am I"。代码编译成功,但输入示例时触发Debug Assertion Failed。
原代码
#include<iostream> #include<string> using namespace std; int x = 0; string reverse(string am); int main() { string st1; getline(cin,st1); reverse(st1); cout << st1.length(); cout<<st1; return 0; } string reverse(string am) { string st2; int i, k, j, r; for (i = 0; i < am.length(); i++) { if (am[i] == ' ') { x = i; for (k = am.length() - 1; k >= am.length() - i; k--) { st2[k] = am[x-1]; x--; } if (i != -1) { st2[i] = ' '; } } } for (r = x + 1,j=0; r< am.length(); i++,j++) { st2[j] = am[r]; } return st2; }
问题分析与修复方案
核心问题1:空字符串直接赋值导致内存越界
st2默认构造为空字符串,未分配内存空间,直接通过st2[k]或st2[i]赋值会触发内存访问断言失败。必须先为st2分配与原字符串相同的长度,或使用push_back/append等安全方式添加字符。
核心问题2:返回值未接收,原字符串未被修改
main函数中调用reverse(st1)但未将返回值赋值给st1,导致最终输出的仍是原字符串,逻辑完全无效。
核心问题3:全局变量与循环逻辑混乱
- 全局变量
x会导致多次调用时状态混乱,应改为函数内局部变量。 - 第一个循环处理空格的逻辑错误,无法正确拆分单词并反转顺序;
i != -1的条件永远成立,无实际意义。 - 最后一个循环的
i变量已在前面循环中走到am.length(),继续i++会引发逻辑错误。
修复后的代码
#include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; string reverseWords(string s) { // 拆分单词到容器 vector<string> words; string word; for (char c : s) { if (c == ' ') { if (!word.empty()) { words.push_back(word); word.clear(); } } else { word += c; } } // 处理最后一个单词 if (!word.empty()) { words.push_back(word); } // 反转单词顺序 reverse(words.begin(), words.end()); // 拼接成结果字符串 string result; for (size_t i = 0; i < words.size(); ++i) { if (i != 0) { result += ' '; } result += words[i]; } return result; } int main() { string st1; getline(cin, st1); st1 = reverseWords(st1); cout << st1.length() << endl; cout << st1 << endl; return 0; }
修复说明
- 用
vector<string>拆分原字符串中的单词,避免手动处理索引的复杂逻辑。 - 使用标准库
reverse函数直接反转单词容器的顺序,简洁高效。 - 拼接时自动处理单词间的空格,避免多余空格或遗漏。
- 去掉全局变量,改用局部变量,保证函数的独立性和可复用性。
- 正确接收返回值,修改原字符串后输出。
内容的提问来源于stack exchange,提问作者open I
相关产品推荐
相关产品推荐

