Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 代码似乎无法正确打印连接的字符串_C_String - Fatal编程技术网

C 代码似乎无法正确打印连接的字符串

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...

我这里有一些代码,给定一个.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......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;
}