为什么字符串长度为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
相关产品推荐
相关产品推荐

