我到目前为止已经添加了两个查找和替换,并且它一切都很好。但是当我添加第三个查找和替换时,要添加一个\ n,其中找到一个点,整个控制台输出变为空白。所有文字都消失了。知道我做错了吗?
这是我要添加的代码,用于替换“。”使用“。\ n”,这会导致打印变为空白。
while (t1.find(".") != string::npos)
t1.replace(t1.find("."), 3, ".\n");
在添加第三个查找和替换之前,这是所有godd工作的其余代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "swedish");
string const txt1 = "Foten är en kroppsdel som förekommer mycket i våra uttryck.";
string const txt2 = "På stående fot betyder omedelbart, utan förberedelse.";
string const txt3 = "Försätta på fri fot betyder att ge någon friheten.";
string const txt4 = "Sätta foten i munnen betyder att göra bort sig.";
string const txt5 = "Få om bakfoten betyder att missuppfatta något.";
string const txt6 = "Skrapa med foten betyder att visa sig underdånig eller ödmjuk.";
string const txt7 = "Stryka på foten betyder att tvingas ge upp.";
string const txt8 = "Leva på stor fot betyder att föra ett dyrbart eller slösaktigt leverne.";
string const txt9 = "Varför fick du foten???";
string t1 = txt1 + txt2 + txt3 + txt4 + txt5 + txt4 + txt5 + txt6 + txt7 + txt8 + txt9;
while (t1.find("fot") != string::npos)
t1.replace(t1.find("fot"), 3, "hand");
while (t1.find("Fot") != string::npos)
t1.replace(t1.find("Fot"), 3, "Hand");
cout << t1;
return 0;
}
答案 0 :(得分:2)
你进入了一个无限循环。 t1.find(".") != string::npos
永远保持true
,因为您会在'.'
替换中将".\n"
插入字符串中。
解决方案是在 find
插入的内容之后,仅在循环中启动每个新的replace
搜索。
顺便说一句,您可能希望使用Boost String Algorithms。然后它成为boost::replace_all(t1, ".", ".\n");
的简单问题。
答案 1 :(得分:2)
替换字符串后,不要从前面搜索字符串!
#include <iostream>
#include <string>
void string_replace_all(std::string& target, std::string_view search_str, std::string_view replace_str)
{
for(
//find first search_str in target
std::size_t pos = target.find(search_str);
//When pos == std::string::npos, not match was found.
pos != std::string::npos;
// Pos is front of last replaced string.
// pos + replace_str.size() is just after replaced string.
// We need to search string from there to avoid infinity loop.
pos = target.find(search_str, pos + replace_str.size())
){
target.replace(pos, search_str.size(), replace_str);
}
}
int main()
{
setlocale(LC_ALL, "swedish");
std::string const txt1 = "Foten är en kroppsdel som förekommer mycket i våra uttryck.";
std::string const txt2 = "På stående fot betyder omedelbart, utan förberedelse.";
std::string const txt3 = "Försätta på fri fot betyder att ge någon friheten.";
std::string const txt4 = "Sätta foten i munnen betyder att göra bort sig.";
std::string const txt5 = "Få om bakfoten betyder att missuppfatta något.";
std::string const txt6 = "Skrapa med foten betyder att visa sig underdånig eller ödmjuk.";
std::string const txt7 = "Stryka på foten betyder att tvingas ge upp.";
std::string const txt8 = "Leva på stor fot betyder att föra ett dyrbart eller slösaktigt leverne.";
std::string const txt9 = "Varför fick du foten???";
std::string t1 = txt1 + txt2 + txt3 + txt4 + txt5 + txt4 + txt5 + txt6 + txt7 + txt8 + txt9;
string_replace_all(t1, "fot", "hand");
string_replace_all(t1, "Fot", "Hand");
string_replace_all(t1, ".", ".\n");
std::cout << t1;
return 0;
}