C++实现字符串查找替换功能仅首次匹配生效该如何修复
错误原因
std::string::replace方法参数使用错误。该方法前两个入参的含义为「替换起始下标」和「需要替换的字符长度」,你代码中传入的第二个参数是i + x,误将子串结束下标当做长度传入,会导致第一次替换就修改了超出目标子串长度的内容,破坏原字符串结构,后续查找自然无法匹配到剩余的目标子串。- 替换完成后下一次查找的起始位置设置错误。你仅执行了
i++操作,正确逻辑应该是跳过刚替换完成的内容,从替换字符串的末尾开始下一次查找,否则如果替换内容包含目标子串会出现重复替换,也可能出现漏匹配的问题。 - 额外注意:
std::string的下标、长度、find方法返回值均为无符号size_t类型,使用int接收会存在类型不匹配的潜在风险。
修复后的完整代码
#include <iostream> #include <string> using namespace std; string Find_Replace(string str, string substr, string replacement){ size_t sub_len = substr.length(); size_t replace_len = replacement.length(); size_t pos = 0; // 循环查找所有匹配的子串 while((pos = str.find(substr, pos)) != string::npos){ // 第二个参数传入目标子串的长度 str.replace(pos, sub_len, replacement); // 下一次查找从替换完成的位置之后开始 pos += replace_len; } return str; } int main(){ cout << "Please enter a text:-" << endl; string str; string substr; string replacement; getline(cin, str); cout << "Please enter a word to find:-" << endl; getline(cin, substr); cout << "Please enter the replacement text:-" << endl; getline(cin, replacement); cout << "The text after process:-" << endl; cout << Find_Replace(str, substr, replacement); return 0; }
内容的提问来源于stack exchange,提问作者Zerocool_m12
相关产品推荐
相关产品推荐

