The OpenNET Project / Index page

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

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"замена "
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"замена " 
Сообщение от pheonix Искать по авторуВ закладки(ok) on 27-Сен-05, 07:49  (MSK)
как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?
  Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

  • замена , Ghecko, 12:35 , 27-Сен-05, (1)  
    • замена , Ant0, 16:05 , 28-Сен-05, (3)  
  • замена , jd, 04:15 , 28-Сен-05, (2)  
  • замена , Alexander S. Salieff, 16:43 , 28-Сен-05, (4)  
    • замена , Ant0, 17:09 , 28-Сен-05, (5)  
      • замена , Alexander S. Salieff, 17:49 , 28-Сен-05, (6)  
        • замена , samara, 00:37 , 05-Окт-05, (7)  

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "замена " 
Сообщение от Ghecko Искать по авторуВ закладки(??) on 27-Сен-05, 12:35  (MSK)
>как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?


#include <stdio.h>
#include <string.h>

static char *strreplace (char *str, const char *search, const char *replace) {

  char *p = NULL;
  char *newstr = NULL;

  p = (char *) strstr (str, search);
  if (! p) return (char *) strdup (str);

  newstr = (char *) malloc (strlen (str) + strlen (replace)
                            - strlen (search) + 10);
  strncpy (newstr, str, p-str);
  newstr[p-str] = 0;
  strcat (newstr, replace);
  p = p + strlen(search);
  if (p)
    strcat (newstr, p);
  if(strstr(newstr,search)) newstr = strreplace(newstr, search, replace);
  return newstr;
}

int main()
{
    char  str[100] =    "asfadsfdsf\nadfdwefd\nsasdasd\ndf\n\ndsffdsfsdf\nsdfsdfdsfds\ndsf\n213213\n";
    char search[100] = "\n";
    char repl[100] = "<br>";
    char *newstr;
    newstr  = strreplace(str, search, repl);
    printf("%s\n", newstr);
    return 0;
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "замена " 
Сообщение от Ant0 Искать по авторуВ закладки on 28-Сен-05, 16:05  (MSK)
char *str_replace (const char *search, const char *replace, const char *subject){
char tmp_str[1024];
char *metka;
if (!strlen(subject) || !strlen(search) || !strlen (replace)) return subject;//не передано всего чего надо
if (metka = strstr(subject, search)){
strncpy(tmp_str, subject, metka - subject);
tmp_str[metka - subject] = '\0';
metka += strlen(search);
strcat (tmp_str, replace);
strcat (tmp_str, metka);
return strdup(str_replace(search, replace, tmp_str));
}else{
return subject;//ничего не найдено
}
}

Примерно из этого же рода, но здесь 2 ошибки: 1 - возможно переполнения буфера в строке tmp_str и 2 - память течет
Вот со второй проблемой я не знаю что делать... :(
Может кто подскажет нормальное решение?

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "замена " 
Сообщение от jd Искать по авторуВ закладки(??) on 28-Сен-05, 04:15  (MSK)
>как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?

sed 's/$/<br>/'
Если нужно именно на C/C++, то уж точно не как в примере, приведённом выше. В зависимости от контекста решение может быть разным.

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "замена " 
Сообщение от Alexander S. Salieff emailИскать по авторуВ закладки on 28-Сен-05, 16:43  (MSK)
>как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?

#include <string>
#include <iostream>
using namespace std;

#include <stdio.h>

int main(int argc, char ** argv)
{
string str("aaa\nbbb\r\nccc\n");
string::size_type i;

cout << str << endl;

i=(string::size_type)0;
while ((i=str.find("\r\n", i))!=str.npos) str.replace(i, 2, "<br>");

i=(string::size_type)0;
while ((i=str.find("\n", i))!=str.npos) str.replace(i, 1, "<br>");

cout << str << endl;

printf("%s\n", str.c_str());

return 0;
}

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "замена " 
Сообщение от Ant0 Искать по авторуВ закладки on 28-Сен-05, 17:09  (MSK)
хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно на С! ;)
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

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

  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "замена " 
Сообщение от samara emailИскать по авторуВ закладки(??) on 05-Окт-05, 00:37  (MSK)
>>хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно
>>на С! ;)
>
>Да какие проблемы, если есть желание изобретать велосипед:
>
>#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 и подобных вещей,
>неплохо бы самому), ну и конечно, можно ввести проверки на различные
>ситуации "от дурака", но мы пока решим, что программер сам себе
>не вредитель :)

а shell  не пойдёт?
я тоже в данный момент занимаюсь этим
на с у меня лучше получется
поэтому заставлаю себя тоже самое делать на shell
такие два скриптика
один превратить txt файл в html
второй сгенерировать простенький index.html
полезно когда с инета скачаеш кучу html
неудобно и медленно открывается из файл менеджера
1. text-to-html
#!/bin/bash -x

HEADER="<html>
<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=koi8-r\">
<title></title>
</head>
<body>
<table width=100%>
<tr>
<td>
<font size=4>
<div align=\"justify\">
"
FOOTER="
</div>
</font>
</td>
</tr>
</table>
</body>
</html>
"
HTML=".html"
for f in *.txt
do
    echo > "$f$HTML" "$HEADER"
    cat -E "$f" | sed -e "s/[$]/<br>/g" >> "$f$HTML"
    echo >> "$f$HTML" "$FOOTER"
done
  
2. - generate-index
#!/bin/bash

HEADER="<html>
<head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=koi8-r\">
<title></title>
</head>
<body>
"
FOOTER="
</body>
</html>
"
echo >> gen-index.html "$HEADER"

for f in [^index]*.htm*
do
    echo >> gen-index.html "<a href=\"$f\">$f</a><br>"
done
  
echo >> gen-index.html "$FOOTER"


  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ]
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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