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

为什么字符串长度为10时,自定义洗牌函数无法正常返回结果?

问题根源

你代码的核心错误是std::string的erase方法参数使用错误:

  • erase的第一个参数是删除起始下标,第二个参数是要删除的字符个数,不是删除结束下标
  • 你写的orig_seq.erase(random,random+2)会导致删除长度随random变大而变大,比如random=4时会删除6个字符,远超过你需要的2个
  • 当删除长度超过剩余字符数时,原字符串会被提前清空,后续执行rand() % orig_seq.length()等价于对0取余,触发未定义行为,程序直接异常退出,没有输出。长度小于10时你没遇到问题只是随机数刚好没触发极端场景,本质错误一直存在。

其他潜在问题

  • 没有调用srand初始化随机种子,每次运行程序洗牌结果完全一致
  • 未校验输入字符串长度必须为偶数,若输入奇数长度字符串会进入死循环
  • 现有洗牌逻辑是每次取连续2个字符拼接,若你的预期是单字符随机洗牌需要调整逻辑

修复后的代码

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
string cardsShuffle(string orig_seq){
    // 校验输入长度为偶数
    if(orig_seq.length() % 2 != 0){
        return "";
    }
    string choice;
    int random = 0;
    string shuffled_seq;
    int orig_len = orig_seq.length();
    
    while(orig_len > shuffled_seq.length()){
        random = rand() % orig_seq.length();
        
        while(random % 2 != 0){
            random = rand() % orig_seq.length();
        }
        
        choice = orig_seq.substr(random,2);
        // 修复erase参数,第二个参数传要删除的长度2
        orig_seq.erase(random,2);
        shuffled_seq = shuffled_seq + choice;
        
    }
    return shuffled_seq;
}

int main()
{
    // 初始化随机种子
    srand(time(0));
    string orig_seq;
    cout << "Enter orig_seq: \n";
    cin >> orig_seq;
    string res = cardsShuffle(orig_seq);
    if(res.empty()){
        cout << "输入字符串长度必须为偶数" << endl;
    }else{
        cout << res << endl;
    }
  
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:24:06