-3

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

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; 

}
4

3 回答 3

1

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

C部分:

  • strlen()- 用于查找 C 字符串长度的函数
  • inputStr, oldStr,newStr都是 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());
}
于 2013-07-05T17:13:19.527 回答
0

我将假设使用内置的 regex/string-replace 函数不能完成任务。

oldStr如果大小相同,搜索和替换不会减少它newStr。您将不得不完全重新生成字符串。或者至少将所有值移过来(重新生成它更容易)。

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

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

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

于 2013-07-05T17:09:19.107 回答
0

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

char* inputStr;
inputStr.find(…

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

于 2013-07-05T17:10:11.570 回答