解析字符串并交换所有出现的内容

时间:2013-07-05 17:04:28

标签: c++ string

我有一个非常混乱的家庭作业,我不知道如何正确地做。赋值要求完成一个C ++函数来解析一个字符串,并将所有出现的子串oldStr与字符串newStr的实例交换。由于替换的结果,inputStr可能需要改变大小...意味着oldStr和newStr不必具有相同的大小。提供了一个函数头。我认为这是一个搜索和替换功能,但我不确定这是否是一个正确的假设。我也得到inputStr必须有类类型的错误? .find和.replace的左边必须有class / struct / union?任何建议将不胜感激。

void parseSwap( char* inputStr, const char* oldStr, const char* newStr  )
{
size_t oldStrLength = strlen(oldStr);
size_t newStrLength = strlen(newStr);
size_t position = 0;

while ((pos = inputStr.find(oldStr, position)) != string::npos)
{
  inputStr.replace( position, oldStrLen, newStr );

  position += newStrLen; 

}

3 个答案:

答案 0 :(得分:1)

您正在使用C样式字符串(char*),就好像它们是C ++字符串(string)。

C部分:

  • strlen() - 用于查找C字符串长度的函数
  • inputStroldStrnewStr都是C字符串

C ++部分:

  • string是C ++中的类,表示字符串。
  • find()
  • 中提供了replace()length()string函数
  • string::npos

这个C ++代码应该可以胜任。您需要添加标题<iostream><string>

void parseSwap(string& inputStr, const string& oldStr, const string& newStr)
{
    size_t oldStrLen = oldStr.length();
    size_t newStrLen = newStr.length();
    size_t position = 0;

    while ((position = inputStr.find(oldStr, position)) != string::npos)
    {
      inputStr.replace( position, oldStrLen, newStr );

      position += newStrLen; 

    }
}

如果您无法更改函数参数并仍想使用旧代码,请使用此代码。您仍然必须包含上述标题。

void parseSwap( char* inputStr, const char* oldStr, const char* newStr  )
{
    string input_string(inputStr);
    string old_string(oldStr);
    string new_string(newStr);
    size_t position = 0;

    while ((position = input_string.find(old_string, position)) != string::npos)
    {
      input_string.replace( position, old_string.length(), new_string );
      position += new_string.length();
    }

    strcpy(inputStr, input_string.c_str());
}

答案 1 :(得分:0)

我打算写这个假设使用内置的正则表达式/字符串替换函数不能完成赋值。

如果oldStrnewStr的大小不同,则搜索和替换不会削减它。你将不得不完全重新生成字符串。或者至少将所有值移动(重新生成它更容易)。

我会做的是创建一个新字符串,然后用旧字符串中的内容填充它,除了替换字符。

您可以使用DFA来标识需要替换的字符串部分

我的想法是你可以开始尝试匹配字符串,如果找到匹配项,将newstr添加到新字符串中,如果发现它不匹配,则附加不匹配的部分to newstr

答案 2 :(得分:0)

是的,这是搜索和替换,但您需要做的不仅仅是依靠现有的例程来考虑不同大小的子串。

char* inputStr;
inputStr.find(…

您的错误是因为您将char *视为std::string对象。不要那样做。