2014-11-20 4 views
-7
#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).Замена подстроки из строки с другой строкой в ​​с

+2

Прочитайте документацию ?? – HamZa

+1

Больше контекста, пожалуйста? Является ли 'p' местом в исходной строке, которую мы заменяем? Является ли str или orig исходной строкой? Или это строка, которую мы заменяем внутри str? Предположим, вы сначала скопировали str/orig в буфер? – Rup

+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 предположить, является 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!" 
+0

@ Davic C thanx много sir .......... –

+0

Если это помогает, не забудьте «принять» мой ответ, щелкнув поле рядом с номером в левом верхнем углу ответа. Рад, что смог помочь. –

Смежные вопросы