C++实现17位指定字符串替换为单个字母及获取元素索引方案
问题分析
- 替换逻辑错误:当前
replace函数的实现是检测到输入包含对应特征串后,直接将原特征串拼入结果,没有执行替换为对应字母的操作,这是输出不符合预期的直接原因。 - 匹配顺序错误:按
Subs数组的顺序遍历查找匹配项,没有按照输入字符串从左到右的顺序处理,会导致输出顺序和输入不一致,同时数组中重复的特征串会被多次检测到,造成输出重复内容。 - 未清空已处理片段:检测到匹配后没有移除已经处理过的输入内容,会导致重复匹配相同片段。
- 递归调用
main属于C++未定义行为,不建议使用该方式实现重复输入逻辑。
修复代码
你的所有特征串均为固定17位长度,可采用从左到右逐段匹配的逻辑实现替换,修改后的replace函数如下:
std::string replace(std::string rep) { int sub_count = sizeof(Subs)/sizeof(Subs[0]); std::string result; const int FEATURE_LEN = 17; int current_pos = 0; while (current_pos + FEATURE_LEN <= rep.size()) { // 截取当前位置17位特征串 std::string current_feature = rep.substr(current_pos, FEATURE_LEN); // 查找对应索引 for (int i = 0; i < sub_count; i++) { if (current_feature == Subs[i]) { // 拼接对应字母 result += Alphabet[i]; break; } } // 移动到下一个特征串起始位置 current_pos += FEATURE_LEN; } return result; }
如果后续特征串长度不固定,可以改用如下通用实现:
std::string replace(std::string rep) { int sub_count = sizeof(Subs)/sizeof(Subs[0]); std::string result; size_t current_pos = 0; while (current_pos < rep.size()) { bool found = false; for (int i = 0; i < sub_count; i++) { size_t sub_len = Subs[i].size(); if (current_pos + sub_len > rep.size()) continue; if (rep.substr(current_pos, sub_len) == Subs[i]) { result += Alphabet[i]; current_pos += sub_len; found = true; break; } } if (!found) { // 未匹配的字符可按需选择保留或丢弃 current_pos++; } } return result; }
注意事项
- 请确认
Subs数组和Alphabet数组的索引对应关系符合你的需求,当前你提供的完整代码中Alphabet[0]为空格,若要达到示例输入输出abc的效果,需要将对应三个特征串所在索引的Alphabet值调整为a、b、c。 - 建议将递归调用
main的逻辑改为循环输入,避免未定义行为。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

