#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)
的工作情况。
答案 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)
。
请注意,str
(sprintf declaration
)的类型为char *
,这意味着buffer+(p-str)
也必须是char *
类型(字符指针)。 buffer
有一个指针地址,例如1000
。对于该地址,我们将添加差异p-str
(比如25)。因此,sprintf
命令会将两个字符串rep
和p+strlen(orig)
合并到内存1000 + 25 = 1025
我们还从格式字符串"%s%s"
知道,rep
和p+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!"