无法在数组中查找子字符串

时间:2017-11-10 21:49:38

标签: c substring

我试图搜索一些HTTP标头,并且正在查找包含" bbc.co.uk"的数据包。
据我所知,我正确使用这些方法,但我必须忽略一些显而易见的事情,因为找不到匹配的东西,尽管我打印出的数据包内容已经存在,匹配。
任何人都可以看到错误吗?

 void parseHTTP(const unsigned char *packet, int length)
{
  int i;
  const char *blacklisted = "www.bbc.co.uk/news"; 
  const char *payload[length+1];  
  for(i = 0; i < length; i++)
  {
      char byte = packet[i];
      if (byte > 31 && byte < 127)
      {
          printf("%c", byte);
          payload[i] = byte;
      }
  }
  //char *result;
  //result = strstr(payload, blacklisted);
  //printf("%s", result);
  if(strstr(payload, blacklisted) != NULL)
  {
    printf("Found match \n");
    blacklistedCount ++;
  }
}

3 个答案:

答案 0 :(得分:1)

您能否提供一些更具体的细节。

payload[i] = byte;// payload is array of char pointer, what's the need of storing single character into array of pointer, take payload as a single pointer


strstr(payload, blacklisted) 

strstr()第一个参数是 char * ,但你采用 char指针数组

修改您的代码如下:

void parseHTTP(const unsigned char *packet, int length)
{
        int i,j=0,blacklistedCount=0;
        const char *blacklisted = "www.bbc.co.uk/news"; 
        char *payload=malloc(length);  
        for(i = 0; i < length; i++)
        {
                char byte = packet[i];
                if (byte > 31 && byte < 127)
                {
                        printf("%c", byte);
                        payload[j++] = byte;
                        continue;// add this
                }
                else
                {
                        payload[j]='\0';
                        if(strstr(payload, blacklisted) != NULL)
                        {
                                printf("Found match : %d \n",blacklistedCount ++);
                        }
                        j=0;//again make it 0
                }
        }
}

根据您的要求进行修改。

答案 1 :(得分:0)

在一般的HTTP流量中,主机名和路径通常是分开的,如下所示进行拆分:

GET /news HTTP/1.1
Host: www.bbc.co.uk

(加上更多请求标头)。因此,包含HTTP流量的TCP段永远不会包含字符串www.bbc.co.uk/news逐字。

答案 2 :(得分:0)

payload的类型是一个char指针数组,它是一个4/8(平台相关)字节类型。 这意味着数组中每4个字节中有3个是0,在大多数平台上都是'\0',因此strstr函数运行0-1次迭代,具体取决于系统的Endianity。

您正在寻找的定义可能是char payload[length+1];

在此期间 - 也没有理由认为packetunsigned

另外:

for(i = 0; i < length; i++)
{
    char byte = packet[i];
    if (byte > 31 && byte < 127)
    {
        printf("%c", byte);
        payload[i] = byte;
    }
}

请注意,您在ipayload上使用packet - 同时跳过可能包含在packetpayload中的不可打印字符(或相应的行下划线字符) {1}}。 当您跳过这种方式时,您会在您跳过的索引中保留\0的未初始化数据,这可能很容易strstr终止字符串并停止\0

出于这个原因,您还应该在payload数组中添加一个尾随i

要解决此问题,请保留2个索引,jj - 并且仅在if payload[j++] = byte;

内提前{{1}}