在这里我有一些代码,给定一个内容为.p的.txt文件
find replace pre
pre
cpre
,我要查找“ pre”的每个实例,并在其后附加“ k”。即该文件应变为“查找替换kpre”。
所以我首先着手创建一个字符串,该字符串是k和pre的串联 (假设k和pre分别是argv [1]和argv [3])
char appended[1024];
strcpy(appended, argv[1]);
strcat(appended, argv[3]);
printf("appended string is %s", appended); //prints kpre, which is good
char *replaced = replace(buf, argv[3], appended);
//*string is a line in the file
char* replace(char *string, char *find, char *replace) {
char *position;
char temp[1024];
int find_length = strlen(find);
int index = 0;
while ((position = strstr(string, find)) != NULL) {
strcpy(temp, string);
index = position - string;
string[index] = '\0';
strcat(string, replace); //add new word to the string
strcat(string, temp + index + find_length); //add the unsearched
//remainder of the string
}
return string;
}
.................
fputs(replaced, temp);
在控制台上检查,附加=“ kpre”,这是正确的,但是在运行代码时,文件看起来像
find replace kkkkkkkkkkkkkkkk.....kkkkkkk
kkkkkkkkk......kkkkk
ckkkkk....kkkkk
k持续播放了一段时间,一直向右滚动时看不到pre。我很难弄清楚为什么代码不能替换 “ pre”和“ kpre”的实例,即使附加变量看起来正确也是如此。我觉得这与我将temp设置为1024个字符有关,但是即使那样我也不确定为什么将k复制了这么多次。
答案 0 :(得分:1)
这里
while ((position = strstr(string, find)) != NULL) {
您正在将string
传递给strstr()
函数。 strstr()
将把指针返回到find
中第一次出现的string
。当您将pre
替换为kpre
并再次调用strstr()
时,它将重新调整指向pre
中string
的第一个匹配项的指针,这是{ replace
字符串。经过while
循环的一些迭代之后,它将开始访问string
,超出其大小,这将导致不确定的行为。
您应该将指针传递到string
,而不是将strstr()
传递给string
,并且在每次替换操作之后,make指针都指向字符串的被替换部分之后。另一种方法是,您可以使用指针而不是使用strstr()
来遍历字符串字符,如下所示:
#define BUFSZ 1024
char* replace(char *string, const char *find, const char *replace) {
if ((string == NULL) || (find == NULL) || (replace == NULL)) {
printf ("Invalid argument..\n");
return NULL;
}
char temp[BUFSZ];
char *ptr = string;
size_t find_len = strlen(find);
size_t repl_len = strlen(replace);
while (ptr[0]) {
if (strncmp (ptr, find, find_len)) {
ptr++;
continue;
}
strcpy (temp, ptr + find_len); // No need to copy whole string to temp
snprintf (ptr, BUFSZ - (ptr - string), "%s%s", replace, temp);
ptr = ptr + repl_len;
}
return string;
}
请注意,以上代码基于您在问题中发布的示例,目的只是让您了解如何无需使用strstr()
就可以实现目标。编写代码时,请注意其他可能性,例如replace
是一个巨大的字符串。