【问题标题】:c++ replace a string with another string without built in functionsc ++用另一个没有内置函数的字符串替换一个字符串
【发布时间】:2022-01-15 10:26:44
【问题描述】:
void substitute(string stringuser, string subs1, string subs2)
{
    string vchar;
    for (int i = 0; i < stringuser.length(); i++)
    {
        vchar = stringuser[i];
        if (vchar == subs1)
        {
            newstring+=subs2;
        }
        else
        {
            vchar = stringuser[i];
            newstring+=vchar;
        }
    }
}

这是我编写的用另一个字符替换字符串中的字符的代码。但是,它应该适用于 2 个或更多字符,而不仅仅是 1 个。问题是我不知道该怎么做,如果我能在任务中获得任何帮助,我将不胜感激:)

【问题讨论】:

  • 分解它。首先编写一个在大字符串中查找子字符串实例的函数。直到你能做到这一点,你才能替换子字符串,所以询问替换没有多大意义。
  • 旁注:stringuser 如果要更改它,几乎肯定应该通过引用传递
  • 我确实有一个函数可以从给定索引获取子字符串到给定索引:void substring(string &amp;stringuser, int subsn1, int subsn2) { string vchar; if (subsn2 &gt; stringuser.length()) { subsn2 = stringuser.length(); } for (int i = subsn1 - 1; i &lt; subsn2; i++) { vchar = stringuser[i]; newstring+=vchar; } stringuser = newstring; } 我是否也必须将此代码用于替代函数?

标签: c++ string


【解决方案1】:

您正在尝试将一个字符与整个字符串进行比较,但您还必须检查stringuser[i] 旁边的字符。可以这样做:

string substitute(string stringuser, string subs1, string subs2)
{
    string newstring;
    char vchar;
    for (int i = 0; i < stringuser.length(); i++)
    {
        vchar = stringuser[i];
        if (vchar == subs1[0])
        {
            int j;
            for (j = 1; j < subs1.length(); j++)    //We have to compare all symbols
            {
                if (i + j >= stringuser.length())
                    break;
                if (subs1[j] != stringuser[i + j])
                    break;
            }
            if (j == subs1.length())    //If cycle ended succesfully
            {
                newstring += subs2;
                i += subs1.length()-1;  //Skip remaining characters from subs1  
            }
            else
                newstring += vchar;
        }
        else
        {
            vchar = stringuser[i];
            newstring += vchar;
        }
    }
    return newstring;
}

【讨论】:

    【解决方案2】:

    std::string 具有处理子字符串的 find()replace() 方法,例如:

    string substitute(string stringuser, string subs1, string subs2)
    {
        string::size_type pos, start = 0;
        while ((pos = stringuser.find(subs1, start)) != string::npos)
        {
            stringuser.replace(pos, subs1.size(), subs2);
            start = pos + subs2.size();
        }
        return stringuser;
    }
    

    如果不允许使用它们,则将它们替换为您自己的实现,例如:

    string::size_type indexOf(const string &stringuser, const string &subs, string::size_type start = 0)
    {
        if (start < stringuser.size())
        {
            for(string::size_type i = start; i < stringuser.size(); ++i)
            {
                if (stringuser[i] == subs[0])
                {
                    if ((stringuser.size() - i) < subs.size()) {
                        break;
                    }
                    bool match = true;
                    for(string::size_type j = 1; j < subs.size(); ++j)
                    {
                        if (stringuser[i+j] != subs[j])
                        {
                            match = false;
                            break;
                        }
                    }
                    if (match) {
                        return i;
                    }
                }
            }
        }
        return string::npos;
    }
    
    string subString(const string &stringuser, string::size_type pos = 0, string::size_type count = string::npos)
    {
        if (pos > stringuser.size()) {
             throw std::out_of_range("");
        }
        if ((count == string::npos) || ((stringuser.size() - pos) > count) {
            count = stringuser.size() - pos;
        }
        string newstring;
        newstring.reserve(count);
        for(string::size_type i = 0; i < count; ++i) {
            newstring += stringuser[pos+i];
        }
        return newstring;
    }
    
    string substitute(const string &stringuser, const string &subs1, const string &subs2)
    {
        string newstring;
        string::size_type pos, start = 0;
        while ((pos = indexOf(stringuser, subs1, start)) != string::npos)
        {
            if (pos > start) {
                newstring += subString(stringuser, start, pos - start);
            }
            newstring += subs2;
            start = pos + subs2.size();
        }
        if (start < stringuser.size()) {
            newstring += subString(stringuser, start);
        }
        return newstring;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-03
      • 2019-05-14
      • 2021-06-15
      • 2011-06-06
      • 1970-01-01
      • 2011-04-06
      • 2017-01-28
      • 2017-03-07
      相关资源
      最近更新 更多