C++自定义replace字符串替换函数输出结果不符合预期问题排查
问题原因排查
- replace函数核心逻辑完全错误
你当前的实现逻辑是遍历Subs数组,只要子串在输入中存在,就将对应字母追加到结果中,完全没有按照输入字符串的顺序匹配替换,也没有跳过已匹配的17位长度的子串,最终输出的字母顺序是Subs数组的索引顺序,不是输入中子串的出现顺序,和预期完全不符。如果运行时实际输出的是原串片段,大概率是你没有引入<sstream>头文件,std::stringstream行为未定义导致输出异常。
- replace函数核心逻辑完全错误
- 映射数组存在错误
Alphabet数组索引22的位置错误写入了r,本该是字母v,导致映射偏移Subs数组存在多个重复项,重复的17位串会对应不同的字母,匹配时会出现歧义,比如两个相同的9bC5f0q@qA(RKZ>|r分别对应g和h,匹配逻辑无法区分
- main函数递归调用属于未定义行为
C++标准禁止递归调用main函数,会引发不可预期的运行时错误,应该用循环实现重复输入逻辑
- main函数递归调用属于未定义行为
修复方案
第一步:修正替换逻辑
按输入字符串的位置逐段匹配,每次匹配到17位子串后,跳过17位继续匹配后续内容:
std::string replace(std::string rep) { int len = sizeof(Subs)/sizeof(Subs[0]); std::stringstream ss1; int pos = 0; int rep_len = rep.size(); while(pos < rep_len) { // 每次取当前位置开始的17位串匹配 std::string curr_sub = rep.substr(pos, 17); bool matched = false; for(int i = 0; i < len; i++) { if (curr_sub == Subs[i]) { ss1 << Alphabet[i]; pos += 17; matched = true; break; } } if(!matched) { // 没有匹配到可以根据需求处理,比如直接追加原字符或者报错 pos++; } } return ss1.str(); }
第二步:修正映射数组
- 移除
Subs数组中的重复项,保证每个17位串唯一对应一个字母 - 修正
Alphabet数组的拼写错误,把索引22位置的r改为v
第三步:补全头文件,替换main的递归逻辑
#include <iostream> #include <string> #include <sstream> // 你的映射数组代码放在这里 // 修正后的replace函数 std::string algorithm(std::string input) { //其他不相关逻辑 input = replace(input); return input; } int main(void){ int ed; while(true) { std::cin >> ed; if(ed == 1){ //其他不相关函数 } else if(ed == 0){ std::string input; std::cin >> input; input = algorithm(input); std::cout << input << std::endl; break; } else{ std::cout << "1 or 0" << std::endl; } } return 0; }
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

