首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

问一个字符串过滤有关问题

2012-01-20 
问一个字符串过滤问题一下是是一断ISAPI过滤器代码,用来过滤IIS非法信息的,想把“妈的”过滤成“cc”,程序测试

问一个字符串过滤问题
一下是是一断ISAPI过滤器代码,用来过滤IIS非法信息的,想把“妈的”过滤成“cc”,程序测试过英文“ab”换成“cc”可以,中文就不行了,我对C++不太了解,偏偏VB写不了ISAPI。    
还有一个问题就是,如果想定义一个字符串,用“     ¦”隔开,如“非法文字     ¦不良信息”,然后再通过以下代码结合使用,该如何编写才能实现?    
DWORD     CtisapiFilter::OnSendRawData(CHttpFilterContext*     pCtxt,    
                      PHTTP_FILTER_RAW_DATA     pRawData)    
{    
                      //     TODO:     React     to     this     notification     accordingly     and    
                      //     return     the     appropriate     status     code    
                                              char*     pchIn     =     (char*)pRawData-> pvInData;    
                                              for(DWORD     cbBuffer=0;     cbBuffer <pRawData-> cbInData;cbBuffer++)    
                                                                      {    
                                                                      if((pchIn[cbBuffer]== '妈 ')&&    
                                                                                              (pchIn[cbBuffer+1]== '的 '))    
                                                                      {    
                                                                      pchIn[cbBuffer]= 'c ';    
                                                                      pchIn[cbBuffer+1]= 'c ';    
                                                                      }    
              }    


                      return     SF_STATUS_REQ_NEXT_NOTIFICATION;    
}    


[解决办法]
改进一下:

char* pNextStart = pinch; // 假定pinch为C字符串
do
{
char * pTarget = strstr(pNextStart , token);
if (pTarget)
{
for (int i=0; i <strlen(token); ++i)
pTarget[i] = 'c ';
pNextStart = pTarget;
}
} while (pTarget);

[解决办法]
faint,这其实是一个汉字识别的问题!
上面那么多星星的回答,我看的不知所云。

这样来解答!


char *FindSpecStr(char *Source, TBYTE *FindTarget)
{
BOOL bFind = FALSE;
int i,j;
for(i = 0; i < strlen((char*)(Source)) - strlen((char*)FindTarget); i++)
{
for(j = 0; j < strlen((char *)FindTarget); j++)
{
if((TBYTE)(Source[i + j]) != FindTarget[j])
break;
}
if(j == strlen((char *)FindTarget))
{

bFind = TRUE;
break;
}
}
if(bFind)
return Source + i;
else
return NULL;
}

int main()
{
char szSrc[512] = "中国人nihao查找daolema测试abc ";
char szDst[128] = "查找 ";
char *q = FindSpecStr(szSrc, (TBYTE *)szDst);
if(q != NULL)
{
printf( "OK, FIND IT: %s\n ", q);
}
getchar();
return 0;
}


[解决办法]
楼上兄弟的写法只能找出第一个“查找”,后面的就无能为力了。

结合strtok的写法:

const char seps[] = "| ";
char* tokenStr = "非法文字|不良信息 ";

// call
replaceAllToken(pchIn, tokenStr);

char* replaceAllToken(char* pchIn, char* pTokenStr)
{
char* ret = pchIn;

char * token = strtok( pTokenStr, seps );
while( token != NULL )
{
/* Do something with current token */
replaceToken(pchIn, token);

/* Get next token: */
token = strtok( NULL, seps );
}

return ret;
}

char * replaceToken(char* pInch, char* token)
{
char* ret = pInch;

char* pNextStart = pInch; // 假定pinch为C字符串
do
{
char * pTarget = strstr(pNextStart , token);
if (pTarget)
{
for (int i=0; i <strlen(token); ++i)
pTarget[i] = 'c ';
pNextStart = pTarget;
}
} while (pTarget);

return ret;
}

[解决办法]
//结合你的代码,将下面的代码放在头文件CtisapiFilter.h中的private声明中:
typedef struct _strBuff
{
char * val;
int val_len ;
struct _strBuff * next ;
}strBuff;

char * ReplaceAll(char * src_val,char * f_val,char * n_val);

//下面代码放CtisapiFilter.cpp中
char * CtisapiFilter::ReplaceAll(char * src_val,char * old_value,char * new_value)
{
char * rt_buff ;
int len_out = 0 ;

int len_src = (int)strlen(src_val);
int len_fval = (int)strlen(old_value);
int len_nval = (int)strlen(new_value);

char * src_val_up = _strupr( _strdup( src_val ) );
char * old_value_up = _strupr( _strdup( old_value ) );


strBuff * out_ls_head , * out_ls_this , * out_ls_tail , * out_ls_new ;

char * pos , * pos_s ;

if(len_src> 0)
{
src_val_up = _strupr( _strdup( src_val ) );
old_value_up = _strupr( _strdup( old_value ) );


pos_s = src_val_up ;
out_ls_head = 0 ;
out_ls_this = 0 ;
out_ls_tail = 0 ;
out_ls_new = 0 ;

while(pos_s)
{
pos = strstr(pos_s,old_value_up);
out_ls_new = (strBuff*)malloc(sizeof(strBuff));
memset(out_ls_new,0,sizeof(strBuff)) ;
out_ls_this = out_ls_new ;

if(out_ls_head==0)
{
out_ls_head = out_ls_new ;
out_ls_tail = out_ls_new ;
}
else
{
out_ls_tail-> next = out_ls_this ;
out_ls_tail = out_ls_this ;
}

if(pos)
{
out_ls_new-> val = src_val+(pos_s-src_val_up) ;
out_ls_new-> val_len = (int)(pos - pos_s) ;
len_out += ((int)(pos - pos_s) + len_nval) ;
out_ls_new-> next = 0 ;

pos_s = pos + len_fval ;
}
else
{
out_ls_new-> val = src_val+(pos_s-src_val_up) ;
out_ls_new-> val_len = len_src - (int)(pos_s - src_val_up) ;
len_out += out_ls_new-> val_len ;
break ;
}

}

out_ls_this = out_ls_head ;
rt_buff = (char*)malloc(len_out+1) ;
int len_tep = 0 ;
memset(rt_buff,0,len_out+1) ;
while(out_ls_this)
{
memcpy(rt_buff+len_tep,out_ls_this-> val,out_ls_this-> val_len) ;
len_tep += out_ls_this-> val_len ;
if(out_ls_this-> next)
{
memcpy(rt_buff+len_tep,new_value,len_nval) ;
len_tep += len_nval;
}

out_ls_this = out_ls_this-> next ;
}

//free buffer
out_ls_this = out_ls_head ;
while(out_ls_this)
{
out_ls_head = out_ls_this-> next ;
free(out_ls_this);
out_ls_this = out_ls_head ;
}
free(src_val_up);
free(old_value_up);
}
else
{
len_out = 0 ;
rt_buff = (char*)malloc(2) ;
memset(rt_buff,0,2) ;
}

return rt_buff;
}
//具体的用法
char* pchIn = ReplaceAll((char*)pRawData-> pvInData, "T妈的 ", "cc ");
//pchIn 不用的时候别忘了free(pchIn);一下,要不内存泄漏

热点排行