>хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно
>на С! ;)
Да какие проблемы, если есть желание изобретать велосипед:
#include <stdio.h>
#include <string.h>
char * replace(const char * src, const char * delim, const char * repl)
{
char * start_pos=(char *)src;
char * end_pos=(char *)src;
char * dst_ret=NULL;
char * dst_tmp;
size_t dst_len=1; // For trailing NULLTerm
size_t bl_size=0;
int need_brake=0;
if ((dst_ret=calloc(1, 1))==NULL)
{
perror("replace::calloc");
return NULL;
}
while (1)
{
if ((end_pos=strstr(start_pos, delim))==NULL)
{
end_pos=(char *)src+strlen(src);
need_brake=1;
}
bl_size=(end_pos-start_pos)+strlen(repl);
dst_len+=bl_size;
if ((dst_tmp=(char *)realloc(dst_ret, dst_len))==NULL)
{
if (dst_ret) free(dst_ret);
perror("replace::realloc");
return NULL;
}
dst_ret=dst_tmp;
strncat(dst_ret, start_pos, bl_size-strlen(repl));
if (need_brake) break;
strcat(dst_ret, repl);
start_pos=end_pos+strlen(delim);
}
return dst_ret;
}
int main(int argc, char ** argv)
{
char str[100]="aaa\nbbb\r\nccc\n";
char * str1;
char * str2;
str1=replace(str, "\r\n", "<br>");
if (str1==NULL) return 1;
str2=replace(str1, "\n", "<br>");
if (str2==NULL)
{
free(str1);
return 1;
}
printf("[%s]\n", str);
printf("[%s]\n", str2);
free(str1);
free(str2);
return 0;
}
Кое-что можно подоптимизировать (компилятор не станет кэшировать результаты strlen и подобных вещей, неплохо бы самому), ну и конечно, можно ввести проверки на различные ситуации "от дурака", но мы пока решим, что программер сам себе не вредитель :)