我有一个非常混乱的家庭作业,我不知道如何正确地做。赋值要求完成一个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;
}
答案 0 :(得分: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());
}
答案 1 :(得分:0)
我打算写这个假设使用内置的正则表达式/字符串替换函数不能完成赋值。
如果oldStr
和newStr
的大小不同,则搜索和替换不会削减它。你将不得不完全重新生成字符串。或者至少将所有值移动(重新生成它更容易)。
我会做的是创建一个新字符串,然后用旧字符串中的内容填充它,除了替换字符。
您可以使用DFA来标识需要替换的字符串部分
我的想法是你可以开始尝试匹配字符串,如果找到匹配项,将newstr添加到新字符串中,如果发现它不匹配,则附加不匹配的部分to newstr
答案 2 :(得分:0)
是的,这是搜索和替换,但您需要做的不仅仅是依靠现有的例程来考虑不同大小的子串。
char* inputStr;
inputStr.find(…
您的错误是因为您将char *
视为std::string
对象。不要那样做。