如何修复删除字符串 c++ 中所有实例的错误

How to fix error with removing all instances in a string c++

提问人:EthanSteel 提问时间:5/31/2023 最后编辑:EthanSteel 更新时间:8/4/2023 访问量:72

问:

我在删除 c++ 字符串中的所有“amp;”实例时遇到了问题,我创建了一个循环将“amp;”替换为“”,直到没有“amp;”实例。我遇到了一个未知错误,程序开始打印随机字符,我以前从未见过。下面有一张图片。我使用多个其他循环来删除同一程序中的内容,所以我不确定为什么现在会发生这种情况。

角色故障:https://screenrec.com/share/EcVLHoasvU

这是我使用的循环:

try {
  while(DownloadLink.find("amp;") != string::npos){
    DownloadLink.replace(DownloadLink.find("amp;"), 4, "");
  }
} catch (const exception& Error) {
  cerr << "Error: " << Error.what();
}

对于最小可重现的示例:

#include <iostream>
#include <string>

using namespace std;

int main() {
    string DownloadLink;
    
    DownloadLink = "https://rr2---sn-gjo-w43l.googlevideo.com/videoplayback?expire=1685464604&amp;ei=vNF1ZPypCYLk8wS04YS4Bw&amp;ip=193.135.13.240&amp;id=o-AOroxIeyjf0SXpp4Jjav3mMxHNrQnAmWFHliIzDxKFK8&amp;itag=22&amp;source=youtube&amp;requiressl=yes&amp;mh=xJ&amp;mm=31%2C29&amp;mn=sn-gjo-w43l%2Csn-ab5sznly&amp;ms=au%2Crdu&amp;mv=m&amp;mvi=2&amp;pl=24&amp;initcwndbps=248750&amp;spc=qEK7B7YCjgMFmSN1lRYNJdgmcwOfjSE&amp;vprv=1&amp;svpuc=1&amp;mime=video%2Fmp4&amp;ratebypass=yes&amp;dur=1535.256&amp;lmt=1685416420579114&amp;mt=1685442532&amp;fvip=1&amp;fexp=24007246%2C24362688%2C51000022&amp;beids=24350017&amp;c=ANDROID&amp;txp=4318224&amp;sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cratebypass%2Cdur%2Clmt&amp;sig=AOq0QJ8wRAIgOFevBFo84_aL0L8hSD1vwztRDGStTF6OaohO4gA8OIUCIE1wN5685dZ7FROQXO9W7BOv4thF8B3KxFE6iefy60xS&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAOO9mtQzsKDrCes2EPmTwOyB8QtGblPFo30I9VrOsSnMAiEAh91ImIfeaugrIfJ4Q0U30viktdo4sWHv0ywQV0kfjt8%3D&amp;title=Ages+1+-+100+Fight+For+$500,000";
    while(DownloadLink.find("amp;") != string::npos){
        DownloadLink.replace(DownloadLink.find("amp;"), 4, "");
    }
    cout << DownloadLink;

    return 0;
}

以前有没有人见过这样的事情或知道如何提供帮助? 谢谢

C++ 字符串 循环 取代了 错误处理

评论

0赞 Ted Lyngmo 5/31/2023
除非有例外,否则不会打印任何字符,那么你会得到什么例外?什么是类型?请展示一个最小的可重复示例DownloadLink
0赞 EthanSteel 5/31/2023
@TedLyngmo 没有捕获异常,它总是用随机字符显示错误。DownloadLink 的类型是一个字符串,它的当前内容是“rr2---sn-gjo-w43l.googlevideo.com/...”...
0赞 Ted Lyngmo 5/31/2023
然后,请展示一个最小的可重复示例
0赞 EthanSteel 5/31/2023
@TedLyngmo我已将其添加到问题中
2赞 john 5/31/2023
如果我不得不猜测,我会说你看到的奇怪输出是你点击你正在尝试创建的链接会得到的内容。

答:

1赞 Hudson 5/31/2023 #1

首先,我建议您查看此问题,以纠正您因此处列出的原因而使用的操作。 其次,您可以在 C++ 中替换。尝试用任何东西替换某些东西可能会通过擦除它来改善。 至于问题,您已经在评论中说过您重新安装了编译器,因此我不需要解决它。using namespace std;replace()erase()

我修改的代码:

#include <iostream>
#include <string>
int main() {
//You can enter the MrBeast challenge link during initialization
    std::string DownloadLink = "https://rr2---sn-gjo-w43l.googlevideo.com/videoplayback?expire=1685464604&amp;ei=vNF1ZPypCYLk8wS04YS4Bw&amp;ip=193.135.13.240&amp;id=o-AOroxIeyjf0SXpp4Jjav3mMxHNrQnAmWFHliIzDxKFK8&amp;itag=22&amp;source=youtube&amp;requiressl=yes&amp;mh=xJ&amp;mm=31%2C29&amp;mn=sn-gjo-w43l%2Csn-ab5sznly&amp;ms=au%2Crdu&amp;mv=m&amp;mvi=2&amp;pl=24&amp;initcwndbps=248750&amp;spc=qEK7B7YCjgMFmSN1lRYNJdgmcwOfjSE&amp;vprv=1&amp;svpuc=1&amp;mime=video%2Fmp4&amp;ratebypass=yes&amp;dur=1535.256&amp;lmt=1685416420579114&amp;mt=1685442532&amp;fvip=1&amp;fexp=24007246%2C24362688%2C51000022&amp;beids=24350017&amp;c=ANDROID&amp;txp=4318224&amp;sparams=expire%2Cei%2Cip%2Cid%2Citag%2Csource%2Crequiressl%2Cspc%2Cvprv%2Csvpuc%2Cmime%2Cratebypass%2Cdur%2Clmt&amp;sig=AOq0QJ8wRAIgOFevBFo84_aL0L8hSD1vwztRDGStTF6OaohO4gA8OIUCIE1wN5685dZ7FROQXO9W7BOv4thF8B3KxFE6iefy60xS&amp;lsparams=mh%2Cmm%2Cmn%2Cms%2Cmv%2Cmvi%2Cpl%2Cinitcwndbps&amp;lsig=AG3C_xAwRgIhAOO9mtQzsKDrCes2EPmTwOyB8QtGblPFo30I9VrOsSnMAiEAh91ImIfeaugrIfJ4Q0U30viktdo4sWHv0ywQV0kfjt8%3D&amp;title=Ages+1+-+100+Fight+For+$500,000";
    while (true) {
        size_t temp = DownloadLink.find("amp;");//since the link is pretty long, you only have to find it once
        if (temp != std::string::npos) {
            DownloadLink.erase(temp, 4);//you have the position saved in temp
        }
        else { break; }//if there is no more, break
    }
    std::cout << DownloadLink;
    return 0;
}