C++,字符串似乎随机截断 [关闭]

C++, string is seemingly truncating randomly [closed]

提问人:Mr.Moffia 提问时间:3/20/2023 更新时间:3/20/2023 访问量:77

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

8个月前关闭。

我正在尝试创建一个循环,该循环将删除字符串的多个实例,在本例中为“123”,并将它们替换为一系列字符“168”以进行课堂作业。我把那部分记下来了,但无论出于什么原因,字符串的某些部分似乎也在随机位置截断。

代码如下:

#include <iostream>
#include <string>
using namespace std;

int main() {
   string secretStr;
   int indx;
   
   cin >> secretStr;
   indx = 0;
// not part of the code, but I can only edit from here...
   
   while(secretStr.find("123") != string::npos){
    indx = secretStr.find("123");
    secretStr.replace(indx, indx+3, "168"); 
    indx = 0;
   }

//..to here
   cout << "Valid password: " << secretStr << endl;
   
   return 0;
}

我试过弄乱 while 循环的条件,但一直无法找到正确的检查方法。完全有可能我也看错了地方。

C++ 替换 截断

评论

2赞 Retired Ninja 3/20/2023
您提供的输入是什么,预期和实际输出是什么?您可能想了解以下项的预期参数: en.cppreference.com/w/cpp/string/basic_string/replace 是要还是只是?replaceindx+33

答:

2赞 Ietu 3/20/2023 #1

因此,如果我们查看 CPP 字符串替换参数,第二个应该是要由另一个字符串对象替换的字符数。您当前拥有的是 which now 是子字符串的最后一个位置,但是您向它添加 + 3,因此它的位置 3 更高,这是在 之后,当您将其传递给 时,它可能会导致截断。您需要做的就是:lenindx+3123replace

将其替换为secretStr.replace(indx, 3, "168");

例如,只是为了测试,这将在您期望的行为中起作用

#include <iostream>
#include <string>
using namespace std;

int main() {
   string secretStr;
   int indx;
   
   secretStr = "123pass123word123";
   indx = 0;
   
   while(secretStr.find("123") != string::npos){
    indx = secretStr.find("123");
    secretStr.replace(indx, 3, "168"); 
   }

   cout << "Valid password: " << secretStr << endl;
   
   return 0;
}

如果您需要更多帮助,请告诉我。