3. Replace string#
点击查看考点
C 风格数组
Write an program which inputs a string and find the wanted character string, then replace it with your given string, then output the result. If the wanted character string appears more than once, replace them all.
Restriction: You are not allowed to use any content inside <string>
, <cstring>
, <string.h>
or <algorithm>
.
Note: The length of the wanted character string and the given string may be different.
翻译
编写一个程序, 它接受一个字符串 string
, 想要替换的字符串 expected
和替换后的字符串内容 replace
, 在 string
中查找所有 expected
并替换为 replace
.
限制: 你不能使用 <string>
, <cstring>
或 <string.h>
中的任何内容.
注意: expected
和 replace
的长度可能不同.
For example,
1input:
2 string: C++11 is like a new language.
3 find: is
4 replace: was
5
6output:
7 C++11 was like a new language.
点击查看参考解答
没有参考解答, 只有之前回答别人类似的题时的解释. 其中大量手搓了 STL 算法, 而本题并没有限制 STL 算法的使用, 所以别看解答代码很多, 其实除了 replace 函数本身都是有现成的.
对于函数 replace(主字符串 str, 子字符串 substr, 替换字符串 replace)
,
首先从
str
中查找substr
子字符串, 返回子字符串在主字符串中第一个字符的下标.如果没找到, 那结束; 如果找到, 继续以后步骤.
创建一个临时数组
buffer
, 用于暂存结果.拷贝"
str
的substr
子字符串之前的部分"到buffer
中.拷贝"
replace
字符串"到buffer
中.拷贝"
str
的substr
子字符串之后的部分"到buffer
中.将
buffer
中内容拷贝回str
中.由于前后长度可能不同,需要在新的字符串末尾添加上
'\0'
表示这是字符串的结束.
首先从
str
中查找substr
子字符串, 返回子字符串在主字符串中第一个字符的下标.如果没找到, 那结束; 如果找到, 继续以后步骤.
比较
substr
和replace
的大小.如果
replace
更大, 说明需要腾出更多空间, 则子字符串后面的字符应该向右移动来腾出这些空间.如果
substr
更大, 说明替换后这里会有多余的空间, 则子字符串后面的字符应该向左移动, 来填掉这些空间.
调整好空间后, 将字符替换为
replace
的字符.由于前后长度可能不同, 需要在新的字符串末尾添加上
'\0'
表示这是字符串的结束.
警告
由于别人问的这个题函数为 replace(主字符串 str, 子字符串 substr, 替换字符串 replace)
, 参数非常糟糕, 所以替换字符串比原来的子字符串更长时, 替换结果并不正确, 但这是合理的——参数只提供了字符串本身的长度, 并没有给出整个字符数组所能使用的空间大小, 则实现不该假设字符数组所能使用的空间大于字符串当前长度.