C 代码似乎无法正确打印连接的字符串
我这里有一些代码,给定一个.txt文件,其内容是C 代码似乎无法正确打印连接的字符串,c,string,C,String,我这里有一些代码,给定一个.txt文件,其内容是 find replace pre pre cpre ,我想找到“pre”的每个实例,并在其后面加上“k”。ie文件应变为“查找替换kpre” 所以我首先开始创建一个字符串,它是k和pre的串联 (假设k和pre分别是argv[1]和argv[3]) 在控制台上进行检查,added=“kpre”,这是正确的,但是当代码运行时,文件如下所示 find replace kkkkkkkkkkkkkkkk.....kkkkkkk kkkkkkkkk...
find replace pre
pre
cpre
,我想找到“pre”的每个实例,并在其后面加上“k”。ie文件应变为“查找替换kpre”
所以我首先开始创建一个字符串,它是k和pre的串联
(假设k和pre分别是argv[1]和argv[3])
在控制台上进行检查,added=“kpre”,这是正确的,但是当代码运行时,文件如下所示
find replace kkkkkkkkkkkkkkkk.....kkkkkkk
kkkkkkkkk......kkkkk
ckkkkk....kkkkk
k持续了一段时间,当我一直向右滚动时,我看不到pre。我很难弄明白为什么代码不能替换
带有“kpre”的“pre”实例,即使附加的变量看起来是正确的。我有一种感觉,这与我为temp设置了1024个字符有关,但即使如此,我也不知道为什么k被复制了这么多次
while ((position = strstr(string, find)) != NULL) {
您正在将string
传递给strstr()
函数。strstr()
将返回指针,指向string
中第一个出现的find
。当您将pre
替换为kpre
并再次调用strstr()
时,它将重新调整指针,指向string
中第一个出现的pre
,它是replace
字符串的子字符串。在的一些迭代之后,while
循环,它将开始访问超出其大小的字符串,这将导致未定义的行为
不要将string
传递给strstr()
,而应该将指针传递给string
,并且在每次替换操作后,使指针指向字符串的替换部分之后。另一种方法是可以使用指针逐个字符地遍历字符串,而不是使用strstrstr()
,如下所示:
#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
是一个巨大的字符串。这里有一个字符串“pre”
,将“pre”
的所有实例替换为“kpre”
。好啊这给了我“kpre”。现在,从字符串的开头开始,重复该操作。嗯。。。如果从字符串开头开始搜索“pre”
,您肯定会找到一个,因为您刚刚编写了一个。因此,下一个结果将是“kkpre”
,然后是“kkpre”
,然后是“kkkkpre”
等等。看到问题了吗?您必须移动搜索的位置,以不包含刚替换的文本。顺便说一句,指针真的很适合这样做。我认为line index=position-string会将索引更新到已经超过已搜索字符串部分的位置。您的搜索函数(str
)如何知道这个“index”变量存在,更不用说它的值了?如果replace
比find
长,并且find
不是字符串中的最后一个单词,会发生什么情况?
#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;
}