c - C中的就地字符串替换

标签 c algorithm string-algorithm

写一个函数

void inplace(char *str, 
             const char pattern, 
             const char* replacement, 
             size_t mlen)

输入:
str:以\0结尾的字符串。输入表明我们需要一个就地算法。

pattern:一个字母。

替换:字符串。

mlen:内存中存放字符串的大小str从内存的开头开始,mlen应该大于strlen(str)


最终结果还是由str指向。

请注意,应替换所有出现的模式。

例如,

helelo\0............

这里的“helelo”是要在末尾用'\0' 替换的字符串。 '\0' 之后还有 L 个有效字节。我们想用“123”替换“e”。

一个简单的方法是这样的,我们遍历str,当匹配到一个模式时,我们将所有其余部分与位置一起移动以填充替换字符串,然后通过替换替换模式。

如果原始字符串的长度为n并且只包含e,我们需要(n-1) + (n-2) + ... + 1 类次。

Is there an algorithm that scans the string with only one pass and constant memory cost?

最佳答案

我认为最少需要两次通过。在第一遍中,计算将被替换的字符数。鉴于 count 和替换字符串的长度,您可以计算最终字符串的长度。 (并且您应该验证它是否适合缓冲区。)

在第二遍中,您向后扫描字符串(从最后一个字符开始),将字符复制到它们的最终位置。当您遇到搜索字符时,将替换字符串复制到该位置。

在你的例子中,长度的增加是 2。所以你会

copy str[5] which is '\0' to str[7]
copy str[4] which is 'o' to str[6]
copy str[3] which is 'l' to str[5]
copy str[2] which is 'l' to str[4]
at str[1] you find the 'e' so str[3]='3' str[2]='2' str[1]='1'

此时输出索引与输入索引相同,因此您可以打破循环。


正如@chux 在评论中指出的那样,替换字符串为空或只有一个字符的情况可以通过对字符串进行一次前向传递来处理。所以代码应该分别处理这些情况。

关于c - C中的就地字符串替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321997/

相关文章:

python - 在 python 中使用 swig 包装的 typedef 结构和枚举来转换字符串/缓冲区数据

c - 将 .txt 文件中的字符串读入动态数组

python - ctypes中的循环结构,python

C - 无法将无符号字符数组转换为 double

algorithm - 给定一个最佳拟合大小的数组,告诉其他数组可以拟合多少个元素(下面有更多详细信息)

algorithm - 红黑树红 child 属性检查

algorithm - 学习算法和数据结构基础

java - 在一个巨大的集合中找到两个字符串的所有串联

text - 查找文本中与给定关键字相似度最高的子字符串