как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?
>как заменить символы перевода каретки на <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;
}
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 - память течет
Вот со второй проблемой я не знаю что делать... :(
Может кто подскажет нормальное решение?
>как заменить символы перевода каретки на <br> к примеру в строке? есть такая ййункция или нет? если нет как заменить тогда:)?sed 's/$/<br>/'
Если нужно именно на C/C++, то уж точно не как в примере, приведённом выше. В зависимости от контекста решение может быть разным.
>как заменить символы перевода каретки на <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;
}
хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно на С! ;)
>хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно
>на С! ;)Да какие проблемы, если есть желание изобретать велосипед:
#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 и подобных вещей, неплохо бы самому), ну и конечно, можно ввести проверки на различные ситуации "от дурака", но мы пока решим, что программер сам себе не вредитель :)
>>хе-хе, ну на С++ это конечно здорово, но вот хорошо бы именно
>>на С! ;)
>
>Да какие проблемы, если есть желание изобретать велосипед:
>
>#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 -xHEADER="<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/bashHEADER="<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"