c++ 如何从一串文本中删除特定的字母?

cetgtptt  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(101)

我必须编写一个程序,在那里我必须删除文本字符串中的特定字母。
例如,如果用户键入类似"Hepello Ipe hapeve ape prpeobpelepem"的文本,则代码必须自动删除'pe'字母,以便文本变为正常的"Hello I have a problem"
我试着用list函数来编程,但是我的老师说我必须使用指针和动态结构,这是我很烂的。
有人能帮帮我吗?
以下是我目前所拥有的代码。我的第二个代码仍然相当空:

#include <iostream>
#include <string>
#include <list>

using namespace std;

list<string> createCodeList()
{
    list<string> codeList;
    string input;

    cout << "Enter your coded text: " << endl;
    getline(cin, input);
   
    for (int i = 0; i < input.length(); i += 3)
    {
        string code = input.substr(i, 2);
        codeList.push_back(code);
    }

    return codeList;
}

void removeCodeWords(list<string>& codeList)
{
    for (auto it = codeList.begin(); it != codeList.end(); )
    {
        if (*it == "pe")
        {
            it = codeList.erase(it);
        }
        else
        {
            ++it;
        }
    }
}

void printCodeList(const list<string>& codeList)
{
    for (const string& code : codeList)
    {
        cout << code;
    }
    cout << endl;
}

int main()
{
    list<string> codeList = createCodeList();
    removeCodeWords(codeList);
    printCodeList(codeList);
    return 0;
}
#include <iostream>
#include <string>

using namespace std;

struct Codedtext
{
    string text;    
};

typedef Codedtext* point;

point Createlist()
{
    point list = NULL;
    char input;
    cout << "Enter your coded text: " << endl;
    cin >> input;
}

int main()
{
    return 0;
}
xkrw2x1b

xkrw2x1b1#

您的std::list代码不起作用,因为您的createCodeList()函数没有正确地分解用户的输入。它从每组3个字符中提取2个字符,而不管"pe"子字符串实际位于何处(提示:它们不是以3个字符的均匀间隔定位的)。
现在,您正在像这样分解输入:
Hep|ell|o I|pe |hap|eve| ap|e p|rpe|obp|ele|pem
Hep -〉He
ell -〉el
o I -〉o
pe-〉pe(已删除)
hap -〉ha
eve -〉ev
x1米16英寸1x-〉x1米17英寸1x
x1米18英寸1x-〉x1米19英寸1x
x1个月20个月1x-〉x1个月21个月1x
obp -〉ob
x1米24英寸1x-〉x1米25英寸1x
pem-〉pe(已删除)
因此,您的输出结果为:
海芋
而正确的拆分应该如下所示(注意分组长度不同):
He|pe|llo I|pe| ha|pe|ve a|pe| pr|pe|ob|pe|le|pe|m
He
pe(已移除)
llo I
pe(已删除)
ha
pe(已删除)
ve a
pe(已删除)
pr
pe(已删除)
x1米39英寸
pe(已删除)
le
pe(已删除)
m
因此,输出将是:
你好我有个问题
看到区别了吗?
话虽如此,试试这个:

list<string> createCodeList()
{
    list<string> codeList;
    string input;

    cout << "Enter your coded text: " << endl;
    getline(cin, input);
   
    string::size_type start = 0, end;
    while ((end = input.find("pe", start)) != string::npos)
    {
        codeList.push_back(input.substr(start, end-start));
        codeList.push_back("pe");
        start = end + 2;
    }
    if (start < input.size())
        codeList.push_back(input.substr(start));

    return codeList;
}

现在,代码的其余部分将按预期工作。
Online Demo
也就是说,既然你的老师不想让你使用std::list,你可以简单地自己实现链表,如下所示:

#include <iostream>
#include <string>

using namespace std;

struct Codedtext
{
    string text;
    Codedtext* next = nullptr;
};

using CodedtextPtr = Codedtext*;

CodedtextPtr createCodeList()
{
    CodedtextPtr codeList = nullptr;
    CodedtextPtr *node = &codeList;
    string input;

    cout << "Enter your coded text: " << endl;
    getline(cin, input);
   
    string::size_type start = 0, end;
    while ((end = input.find("pe", start)) != string::npos)
    {
        *node = new Codedtext{ input.substr(start, end-start) };
        node = &((*node)->next);

        *node = new Codedtext{ "pe" };
        node = &((*node)->next);

        start = end + 2;
    }
    if (start < input.size())
        *node = new Codedtext{ input.substr(start) };

    return codeList;
}

void removeCodeWords(CodedtextPtr& codeList)
{
    CodedtextPtr* previous = &codeList;
    
    for(auto it = codeList; it != nullptr; )
    {
        CodedtextPtr next = it->next;

        if (it->text == "pe")
        {
            *previous = next;
            delete it;
        }
        else
            previous = &(it->next);

        it = next;
    }
}

void printCodeList(CodedtextPtr codeList)
{
    while (codeList)
    {
        cout << codeList->text;
        codeList = codeList->next;
    }
    cout << endl;
}

void freeCodeList(CodedtextPtr codeList)
{
    while (codeList)
    {
        CodedtextPtr next = codeList->next;
        delete codeList;
        codeList = next;
    }
}

int main()
{
    CodedtextPtr codeList = createCodeList();
    removeCodeWords(codeList);
    printCodeList(codeList);
    freeCodeList(codeList);
    return 0;
}

Online Demo

相关问题