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

编译成功但触发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;
}

修复说明

  1. 用vector<string>拆分原字符串中的单词,避免手动处理索引的复杂逻辑。
  2. 使用标准库reverse函数直接反转单词容器的顺序,简洁高效。
  3. 拼接时自动处理单词间的空格,避免多余空格或遗漏。
  4. 去掉全局变量,改用局部变量,保证函数的独立性和可复用性。
  5. 正确接收返回值,修改原字符串后输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:30:14