gpt4 book ai didi

c - 我如何调整此算法以处理多次出现的要修改的关键字?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:43:52 29 4
gpt4 key购买 nike

我想搜索所有出现的字符串(第一个参数),并在所有出现的第一个字符串之前添加另一个字符串(第二个参数)。

理想情况下,我希望每次出现的 dime 都替换为 limedime。然而,我已经设法做到这一点,只是第一次出现这个词。任何不是第一个的匹配字符串都不会被检测到,并且什么也不做。此外,包含 dime 的多行会根据前几行所做的修改进行修改,这不是我想要的。

这是我得到的一些示例输出:

something dime something dime something something

会变成

something limedime something dime something something

如果我有这个

dime
notimportant!
dime
dime

我会得到

limedime
notimportant!
limelimedime
limelimelimedime

编辑:我修改了代码,以便您可以使用 stdin 轻松测试它,并且还包含了 replace_str():

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

char *replace_str(char *str, char *orig, char *rep)
{
static char buffer[4096];
char *p;

if(!(p = strstr(str, orig)))
return str;

strncpy(buffer, str, p-str);
buffer[p-str] = '\0';

sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));

return buffer;
}

void replace(char* patternoo, char* replacearoo){

char buff[BUFSIZ]; // the input line
char newbuff[BUFSIZ]; // the results of any editing

char pattern[200];
strcpy(pattern, patternoo);

char replace[200];
strcpy(replace, replacearoo);

while ( fgets( buff, BUFSIZ, stdin ) != NULL ) {
if ( strstr( buff, pattern ) != NULL ) {
//THIS IS WHERE WE DO pattern replacing
strcpy(newbuff, replace_str(buff, pattern, strcat(replace,pattern)));

} else {
strcpy( newbuff, buff );
}
printf("%s", newbuff);
}
}
int main(){

replace("dime", "lime");
}

现在,我想也许这种方式不太好,因为我只看线条?我不确定我能做什么,一个一个地阅读每个字符?对我来说似乎有点多,但我不太确定。有什么快速而肮脏的方法来修复我当前的算法吗?还是我必须重新开始并采用全新的方法?

最佳答案

假设您在每次出现 dime 之前插入 lime,您需要读取一行,在输入中找到每次出现的 dime buffer,当找到时,将输入缓冲区未处理的部分复制到输出缓冲区,然后添加lime,然后添加dime,然后在之后继续搜索>一角钱

转化为:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static void replace(char *pattern, char *replace)
{
char buff[BUFSIZ]; // the input line
char newbuff[BUFSIZ]; // the results of any editing
size_t replen = strlen(replace);
size_t patlen = strlen(pattern);

while (fgets(buff, BUFSIZ, stdin) != NULL)
{
newbuff[0] = '\0';
char *dst = newbuff;
char *data = buff;
char *patt;
while ((patt = strstr(data, pattern)) != NULL)
{
memmove(dst, data, (patt - data));
dst += (patt - data);
memmove(dst, replace, replen);
dst += replen;
memmove(dst, pattern, patlen);
dst += patlen;
data = patt + patlen;
}
*dst = '\0';
printf("%s%s", newbuff, data);
}
}

int main(void)
{
replace("dime", "lime");
return 0;
}

该代码愉快地忽略了输入行超长扩展的存在——您需要努力确保它不会溢出输出缓冲区。由于您为每个 dime(4 个字符)插入了 4 个字符 (lime),最坏情况下,输出中需要的空间是输入中空间的两倍。因此,更改 newbuff[2 * BUFSIZ] 的大小将解决这些溢出问题 — 对于您要添加前缀的特定字符串。过长的输入行也可能导致遗漏。如果一个 dime 在两个满缓冲区之间的边界上被分割,它将被遗漏。

给定一个名为 data 的文件(根据您的问题编造):

something dime something dime something something

should become

something limedime something limedime something something

and if I have this

dime
not important!
dime
dime dime
dime dime dime

I will get limes and dimes galore:

limedime
not important!
limedime
limedime limedime
limedime limedime limedime

运行程序(repstr,我调用它)的输出是:

$ ./repstr < data
something limedime something limedime something something

should become

something limelimedime something limelimedime something something

and if I have this

limedime
not important!
limedime
limedime limedime
limedime limedime limedime

I will get limes and limedimes galore:

limelimedime
not important!
limelimedime
limelimedime limelimedime
limelimedime limelimedime limelimedime
$

关于c - 我如何调整此算法以处理多次出现的要修改的关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35474191/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com