The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"замена "
Отправлено Alexander S. Salieff, 28-Сен-05 17:49 
>хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно
>на С! ;)

Да какие проблемы, если есть желание изобретать велосипед:

#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 и подобных вещей, неплохо бы самому), ну и конечно, можно ввести проверки на различные ситуации "от дурака", но мы пока решим, что программер сам себе не вредитель :)

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

На сайте действует частичное премодерирование - после публикации некоторые сообщения от анонимов могут автоматически скрываться ботом. После проверки модератором ошибочно скрытые сообщения раскрываются. Для ускорения раскрытия можно воспользоваться ссылкой "Сообщить модератору", указав в качестве причины обращения "скрыто по ошибке".



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру