在此代码中,我收到以下运行时错误:
在抛出'std :: out_of_range'实例后终止调用 what():basic_string :: replace bash:line 1:9471 Aborted
(核心倾销)
就我而言,这意味着我已经操纵了每个循环内部的向量,而我还没有这样做。
#include <iostream>
#include <string>
#include <vector>
std::string replace(std::string text,
std::string find,
std::string replace)
{
return(text.replace(text.find(find), find.length(), replace));
}
int main()
{
std::vector<std::string> mylist={"col1","cell2","col3","cell4","col5"};
for(const std::string item: mylist)
{
std::cout<<replace(item,"cell","item")<<std::endl;
}
return 0;
}
答案 0 :(得分:3)
find()
std::string
函数会在找不到搜索字符串时返回npos
位置。此npos
位置无法在replace()
中使用,并会出现此错误。
答案 1 :(得分:3)
您正尝试将cell
替换为字符串item
中的col1
。没有这样的子字符串,因此text.find()
将返回string::npos
(通常为((size_t) -1)
,但是特定于实现)。之后,string::npos
将传递给replace()
,这会导致异常。
重写你的功能:
std::string replace(std::string text,
std::string find,
std::string replace)
{
size_t idx = text.find(find);
if(idx == std::string::npos)
return(text);
return(text.replace(idx, find.length(), replace));
}
答案 2 :(得分:0)
这是一个克服运行时错误的程序:
#include <iostream>
#include <string>
#include <vector>
std::string replaceText(std::string text,
std::string f,
std::string r)
{
size_t found = text.find(f);
if (found != std::string::npos)
return(text.replace(found, f.length(), r));
return text;
}
int main()
{
std::vector<std::string> mylist = { "col1", "col2", "col3", "col4", "col5" };
for (const std::string item : mylist)
{
std::cout << replaceText(item, "cell", "item") << std::endl;
}
return 0;
}
主要部分是:
int found = text.find(f);
if (found != std::string::npos)
return(text.replace(text.find(f), f.length(), r));
return text;
使用名为found
的变量来检查找到字符串时要执行的操作。如果找不到字符串,我将返回输入文本。
为了更好的可读性,我更改了函数和变量名称。