用c中的另一个String替换String的子字符串

时间:2014-11-20 10:16:25

标签: c

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

char *replace_str(char *str, char *orig, char *rep)
{
    static char buffer[4096];
    char *p;

    if(!(p = strstr(str, orig))) // Is 'orig' even in 'str'?
        return str;

    strncpy(buffer, str, p-str);

    // Copy characters from 'str' start to 'orig' st$
    buffer[p-str] = '\0';
    sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig)); // <-- here

    return buffer;
}

int main(void)
{
    puts(replace_str("Hello, world!", "world", "Miami"));
    return 0;
}

此代码如何工作,请详细解释...... 我无法识别p+strlen(orig)的工作情况。

1 个答案:

答案 0 :(得分:1)

sprintf命令具有以下声明:

sprintf(char *str, const char *format, ...);

您的声明是:

sprintf(buffer+(p-str), "%s%s", rep, p+strlen(orig));

sprintf命令根据格式字符串str写入字符指针rep,值p+strlen(orig)"%s%s"。从本质上讲,它只是在rep中组合(或连接)p+strlen(orig)buffer+(p-str)

请注意,strsprintf declaration)的类型为char *,这意味着buffer+(p-str)也必须是char *类型(字符指针)。 buffer有一个指针地址,例如1000。对于该地址,我们将添加差异p-str(比如25)。因此,sprintf命令会将两个字符串repp+strlen(orig)合并到内存1000 + 25 = 1025

开头的内存中

我们还从格式字符串"%s%s"知道,repp+strlen(orig)同样是char *类型的指针。 rep的地址是它的任何地址,但下一个char *指针p+strlen(orig)将是p(比如1500)+ strlen(orig)orig的长度1}}假设为20 chars。因此sprintf会将地址1520处的字符串值以及字符rep读取到地址{{1处的buffer (或者这个例子是1025)。

让我们说指针指向以下字符串:

buffer+(p-str)

让我们说rep = "In the beginning" p = "the sky was blue and there was light!"

strlen(orig) = 20

因此缓冲区中的结果字符串(我的假地址1025)是:

  p+strlen(orig) = p[20] = " there was light!"