2014-01-24 2 views
-4

Большинство модулей, которые я нашел в Интернете, заменят только первое вхождение этой строки. Но я хочу модуль, который будет искать каждое вхождение и заменит эту строку. Я нашел код в переполнении стека, который был очень утомительным, поэтому я не смотрю на него. И среда, в которой я работаю, поддерживает только компилятор C. Поэтому комментарии к настройкам команд C++ не оцениваются. Это до тех пор, пока я пришел. Он все еще бросает мне ошибки. Любая помощь приветствуется.Строка заменит несколько случаев в C

#include <stdio.h> 
#include <string.h> 
char *replace_str(char *str, char *orig, char *rep) 
{ 
    char *buffer; 
    char *p, *work; 

    while(strstr(str,orig)) 
    { 
    p = strstr(str, orig); 

    strncpy(work, str, p-str); 
    strcat(buffer, work); 
    //strncpy(buffer+strlen(buffer), str, p-str); 
    strcat(buffer, rep); 
    p+=strlen(orig); 
    str = p; 
    } 
    return strcat(buffer,p); 
} 
int main(void) 
{ 
    puts(replace_str("Hello, Kate! I once had a cat named Kate! ", "Kate", "Paul")); 
    return 0; 
} 
+0

* Я нашел код в переполнении стека, который был очень утомительным, поэтому я не рассматриваю его * Не самый конструктивный подход. Если мы ответим, как мы узнаем, будет ли это слишком сложно для вас? – cnicutar

+0

Покажите мне «утомительный» код, и если я соглашусь с вами на его «утомительность», я отвечу на ваш вопрос. –

+0

@cnicutar: Очень верно. Просто, утром 5 утра, а чем проще код, тем легче логика. Потому что этот код, который я делаю, придется кому-то отредактировать, когда-нибудь. И я не хочу, чтобы тот же человек думал так, что код слишком велик, чтобы отлаживать. Извините, если бы я был пустым на этом. Просто казалось справедливым, чтобы быть правдой. –

ответ

2

Ваш код производит неопределенное поведение, потому что вы пытаетесь скопировать из/в обоих buffer и work без выделения памяти для них. Используйте malloc и не забудьте сделать free все правильно.

Если замена ограничена той же длиной, что и строка, подлежащая замене, то вам вообще не нужны буферы. В противном случае вы должны убедиться, что вы вернули строку позже в вызывающей части free.

+0

Но использование malloc дало мне нежелательные значения. Как и в этом коде: http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=10890&lngWId=3 –

+0

Также, если вы прочтете комментарии этого сообщения, вы увидите, что один человек комментирует, что не очень умно использовать malloc, поскольку он хранится в очень нежелательных местах. Я не знаю, что именно он пытался передать. –

+1

Комментарий, на который вы ссылаетесь, объясняет, почему код в ссылке не должен использоваться. 'malloc (0)' означает: выделить нулевые байты. Это бессмысленно. Проблема заключается не в том, что вы не должны использовать 'malloc', проблема в том, что автор кода в ссылке не использовал его правильно. Вы должны указать длину строки (+1 для завершения нуля) на 'malloc'. – Nabla

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