Команда 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
предположить, является 20 chars
. Так sprintf
прочтет значение строки, начиная с адреса 1520
вместе со строкой rep
в . buffer
по адресу buffer+(p-str)
(или 1025 для данного примера)
Допустим, точка указатели на следующие строки:
rep = "In the beginning"
p = "the sky was blue and there was light!"
Позволяет также сказать, что strlen(orig) = 20
p+strlen(orig) = p[20] = " there was light!"
Таким образом, результирующая строка в буфере (мой фальшивый адрес 1025) является:
buffer+(p-str) = "In the beginning there was light!"
Прочитайте документацию ?? – HamZa
Больше контекста, пожалуйста? Является ли 'p' местом в исходной строке, которую мы заменяем? Является ли str или orig исходной строкой? Или это строка, которую мы заменяем внутри str? Предположим, вы сначала скопировали str/orig в буфер? – Rup
Да .... но все еще не в состоянии распознать, как указатель работает в этом коде –