代码似乎无法正确打印串联的字符串

时间:2019-02-03 02:27:15

标签: c string

在这里我有一些代码,给定一个内容为.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复制了这么多次。

1 个答案:

答案 0 :(得分:1)

这里

    while ((position = strstr(string, find)) != NULL) {

您正在将string传递给strstr()函数。 strstr()将把指针返回到find中第一次出现的string。当您将pre替换为kpre并再次调用strstr()时,它将重新调整指向prestring的第一个匹配项的指针,这是{ 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是一个巨大的字符串。