查找和替换子字符串(C语言)

Chr*_*ris 1 c string

我编写了以下代码,目的是在字符串上使用指针算法来查找和替换目标子字符串.显然,它不优雅,但不幸的是它也是不正确的 - 它为字符串添加了无关的字符.

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

int main() {
    char string[] = "The quick brown fox jumped over the lazy dog.";
    char target[] = "brown"
    char replacement[] = "ochre";
    char segment[80+1];
    char pre_segment[80+1];
    char post_segment[80+1];
    int S = strlen(string), T = strlen(target);
    for (int i = 0; i < S; i++) {
        strncpy(segment, string + i, T);
        if (strcmp(segment, target) == 0) {
        >>> strncpy(pre_segment, string, i); <<<
            strncpy(post_segment, string + i + T,
                S - (i + T));
            strcat(pre_segment, replacement);
            strcat(pre_segment, post_segment);
            printf("%s\n", pre_segment);
        }
    }
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

在标记为>>> this <<<的行之后,在将替换与pre_segment连接之前,已经预先替换了无关字符.

有人可以给我一些如何调试的建议吗?(建议更好的解决方案也欢迎,但请尽量明确.另外,我不应该为此使用动态内存分配.)

ric*_*ici 5

不要用strncpy.它几乎肯定不会做你认为它做的事情.特别是,它不保证NUL终止,同时愚弄人们认为它确实如此.如果要精确复制n字符,请使用memcpy(dest, src, n);然后显式NUL-terminate with dest[n] = '\0';.缺少NUL终止可能会导致您的问题.(检查你的调试器!)

但是,根本不需要这样做strncpy.使用strncmpmemcmp.(仅memcmp当您知道strlen(target)字符串中至少剩余字节时才使用.)如果strlen(target)字节从string匹配中的某个点开始target,那么您已找到匹配项.

更好的是用于strstr查找下一个字符串.