C ++ s.replace不会替换“。”用“。\ n”

时间:2017-12-03 13:21:17

标签: c++ string replace while-loop

我到目前为止已经添加了两个查找和替换,并且它一切都很好。但是当我添加第三个查找和替换时,要添加一个\ 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;

}

2 个答案:

答案 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;

}

https://wandbox.org/permlink/KejSz05Ja0bu9mN8