问个问题 如何把一个字符串中的用<>括起来的内容都删掉???

vincent19861123 2010-05-17 02:18:05
比如:string str = "和 <a href="/2008/index.php/space/2">张丹</a> 成为好友 ";

把<>内的内容都删去 变成 str = "和张丹成为好友"

求解答 请写出 一个函数接口
...全文
185 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
ljyit 2010-05-17
  • 打赏
  • 举报
回复

char buff[1024];
func(buff,"和 <a href=2008/index.php/space/2>张丹</a> 成为好友 ",'<','>');
MessageBox(buff);

void func(char* dest,char* source,char begin,char end)
{
int status=0;
while (*source !='\0')
{
switch(status)
{
case 0:
if (*source == begin) status=1;//发现开始符
else *dest++ = *source;
break;
case 1:
if (*source == end) status =0;//发现结束符
}

source++;
}
*dest=0;
}
mzlogin 2010-05-17
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 phil1984 的回复:]

C/C++ code

void func( std::string &s ){
size_t off1 = 0, off2;
while( true ){
off1 = s.find( '<', off1 );
if( off1 == -1 ){
break;
}
else{
……
[/Quote]

GOOD~
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
嗯,没错,如果用我那个,你还要从string里,提取c_str,有点麻烦
不过,如果你用的是全c的,就可以用我那个了
vincent19861123 2010-05-17
  • 打赏
  • 举报
回复
zhangweiit
我的用c++ 是来操作 string 数组的 正好合适
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
没错,phil的也是对的
他那个用stl的string比较简单
如果你的项目是可以用C++的,那就用他那个
vincent19861123 2010-05-17
  • 打赏
  • 举报
回复
phil1984
哇 您的对了 正和我意 您是大神
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复


char *et_str_cut(char *src, size_t begin, size_t need_len)
{
size_t src_len = strlen(src);
size_t i = 0;
size_t dst_len = src_len - need_len;

if(begin + need_len > src_len)
{
return src;
}

for(i = begin; i < dst_len; i++)
{
src[i] = src[i + need_len];
}
src[dst_len] = '\0';
return src;

}
vincent19861123 2010-05-17
  • 打赏
  • 举报
回复
zhangweiit
应该还少个函数 et_str_cut
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
我这个项目的编译器,不支持c++,所以,都是全C的,没法使用stl之类的东西
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
你试试看,如果不行,我再帮你看
phil1984 2010-05-17
  • 打赏
  • 举报
回复

void func( std::string &s ){
size_t off1 = 0, off2;
while( true ){
off1 = s.find( '<', off1 );
if( off1 == -1 ){
break;
}
else{
off2 = s.find( '>', off1 );
if( off2 == -1 )
off1 += 1;
else
s.erase( off1, off2 - off1 + 1 );
}
}

}
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
char src[50] = "aaa<font size='2'>bbb</font>ccc";
char dst[50] = "";
et_str_xml_clear(dst,src);
printf("\n%s\n",dst);
vincent19861123 2010-05-17
  • 打赏
  • 举报
回复
zhangweiit
能说说这个et_str_xml_clear函数 怎么用么
那个char *dst 形参是要传什么进去啊
我新手
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
我有一整套关于字符操作的函数
支持中文
有需要的话,可以把代码给你参考

int et_str_s2i(const char *src);
char *et_str_i2s(int num, char *dst);
long et_str_s2l(const char *src);
char *et_str_l2s(long num, char *dst);
double et_str_s2f(const char *src);
char *et_str_f2s(float num, char *dst);
char *et_str_c2s(char *dst, char ch);
char et_str_s2c(const char *src);
int et_str_c2i(char ch);

bool et_str_contains(const char *src, char ch);
char *et_str_rev(char *src);
char *et_str_pre(const char *pre, char *src);
char *et_str_repeat(char *dst, const char *src, size_t times);
char *et_str_addslashes(char *dst, const char *src, char find);
char *et_str_stripslashes(char *dst, const char *src, char find);

char *et_str_bin2dec(char *dst, const char *src);
char *et_str_dec2bin(char *dst, const char *src);
char *et_str_hex2dec(char *dst, const char *src);
char *et_str_dec2hex(char *dst, const char *src);
char *et_str_bin2hex(char *dst, const char *src);
char *et_str_hex2bin(char *dst, const char *src);

char *et_str_tolower(char *src);
char *et_str_toupper(char *src);
char *et_str_sub(char *dst, const char *src, size_t start, size_t len);

int et_str_pos(const char *src, const char *find);
int et_str_pos_from(const char *src, const char *find, size_t from_pos);
int et_str_rpos(const char *src, const char *find);
size_t et_str_count(const char *src, const char *find);

char *et_str_trim(char *src);
char *et_str_ltrim(char *src);
char *et_str_rtrim(char *src);

char *et_str_pad(char *src, char *pad_str, size_t pad_len);
char *et_str_lpad(char *src, char *pad_str, size_t pad_len);
char *et_str_rpad(char *src, char *pad_str, size_t pad_len);

char *et_str_cut(char *src, size_t begin, size_t need_len);
char *et_str_insert(char *src, const char *append, size_t begin);
char *et_str_splice(char *src, size_t begin, size_t len, const char *insert);
char *et_str_replace(char *src, const char *find, const char *replace);
char **et_str_arr_alloc(char ***arr, size_t rows, size_t cols);
char **et_str_arr_free(char ***arr, size_t rows);
char **et_str_split(char **dst, size_t *size, const char *src, const char* delimiter);
char *et_str_join(char *dst, const char* delimiter, const char **src, size_t size);

char *et_str_cap(char *src);
char *et_str_uncap(char *src);
bool et_str_has_chs(const char *src);
bool et_str_is_chs(const char *src);
bool et_str_is_int(const char *src);
bool et_str_is_float(const char *src);
bool et_str_is_email(const char *src);
bool et_str_is_domain(const char *src);
bool et_str_is_uri(const char *src);
bool et_str_is_ymd(const char *src);
char *et_str_fix_num(char *src,size_t dec_len);

char *et_str_md5(char *dst, const char *src);
char *et_str_sha1(char *dst, const char* src);
char *et_str_crc(char *dst, const char* src);
char *et_str_base64_enc(char *dst, const char *src);
char *et_str_base64_dec(char *dst, const char *src);
char *et_str_url_enc(char *dst, const char *src);
char *et_str_url_dec(char *dst, const char *src);
char *et_str_xml_enc(char *dst, const char *src);
char *et_str_xml_dec(char *dst, const char *src);
char *et_str_xml_clear(char *dst, const char *src);

zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
你调用 那个et_str_xml_clear函数就可以
在et_str_xml_clear中会用到et_str_pos_from,所以我把这个函数也贴了出来
zhangweiit 2010-05-17
  • 打赏
  • 举报
回复
我今天正好写了一段这样的代码
作用是用来删除字符中的xml字符


int et_str_pos_from(const char *src, const char *find, size_t from_pos)
{
int bMatch = 0;
size_t len_src = strlen(src);
size_t len_find = strlen(find);
size_t i = 0;
int pos = -1;
int temp_pos = 0;
size_t match_count = 0;
if(len_src - from_pos < len_find
|| from_pos < 0
|| from_pos >= len_src
|| from_pos < 0)
{
return -1;
}
for(i = from_pos; i < len_src; i++)
{
if(!bMatch)
{
if(src[i] == find[0])
{
bMatch = 1;
match_count = 1;
temp_pos = i;
}
else
{
continue;
}
}
else
{
if(src[i] == find[match_count])
{
match_count++;
}
else
{
bMatch = 0;
match_count = 0;
}
}
if(match_count == len_find)
{
return temp_pos;
}
}
return -1;
}

char *et_str_xml_clear(char *dst, const char *src)
{
int left_bracket_pos = 0;
int right_bracket_pos = 0;
int pos = 0;
strcpy(dst,src);
left_bracket_pos = et_str_pos_from(dst,"<",pos);
right_bracket_pos = et_str_pos_from(dst,">",pos);
while(left_bracket_pos != -1
&& right_bracket_pos != -1
&& left_bracket_pos < right_bracket_pos )
{
pos = left_bracket_pos;
et_str_cut(dst,left_bracket_pos,right_bracket_pos - left_bracket_pos + 1);
left_bracket_pos = et_str_pos_from(dst,"<",pos);
right_bracket_pos = et_str_pos_from(dst,">",pos);
}
return dst;
}
lanneret1234 2010-05-17
  • 打赏
  • 举报
回复
遍历字符串 用堆栈把发现的"<" 索引压进去 发现">"判断栈是否为空 不为空就把<>之间的字符删掉 在把栈顶的"<"弹出
vincent19861123 2010-05-17
  • 打赏
  • 举报
回复
cao_julians

改了以后编译后运行 出现
“Input.exe”: 已加载“D:\文档\课件\Ch1\Code\Input\Debug\Input.exe”,已加载符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\ntdll.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\kernel32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\user32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\gdi32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\shlwapi.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\advapi32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\rpcrt4.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\secur32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\msvcrt.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\oleacc.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\msvcp60.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\ole32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\oleaut32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\winspool.drv”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\comdlg32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\comctl32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\shell32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\imm32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\lpk.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\usp10.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.5512_x-ww_35d4ce83\comctl32.dll”,未加载任何符号。
“Input.exe”: 已加载“C:\WINDOWS\system32\uxtheme.dll”,未加载任何符号。
Input.exe 中的 0x0058632c 处最可能的异常: 0xC0000005: 写入位置 0x0061281b 时发生访问冲突
Input.exe 中的 0x0058632c 处未处理的异常: 0xC0000005: 写入位置 0x0061281b 时发生访问冲突
liutengfeigo 2010-05-17
  • 打赏
  • 举报
回复
帮顶吧,我也不会
cao_julians 2010-05-17
  • 打赏
  • 举报
回复
case 1: if(*p=='>') /*seek '>'*/
{ last=q;
====================
error :change to last=p;
加载更多回复(5)

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧