【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, strncmp和memcmp

   在单片机调试的的时候,发现目标‘字符串’中的 目标字符,strstr()函数竟然检测不到(比较不出来)返回的时候0x00地址(NULL),很是奇怪,最后分析发现,原来是目标‘字符串’中含有0x00数据,strstr()函数碰到0x00就终止了查找,所以0x00后面的目标字符无法查到,strstr()返回的是0x0地址,指向的字符是0x00上的字符。

  在用strstr查找之前加了一个剔除0x00数据才小程序,去掉待检数组中的0x00数据,问题就解决了。

void  remove_out_0x00_dat(char *in_buff, int data_len)
{
    int str_len = 0;
    for(int i = 0; i < data_len; i++)
    {
        if(in_buff[i] != 0x00)
        {
            in_buff[str_len] = in_buff[i];
            str_len++;
        }
    }
}

【strstr()函数的局限】strstr()检测不到存在的字符/数据/strcmp, <wbr>strncmp和memcmp

 

 strcmp, strncmp和memcmp的区别

函数:int memcmp (const void *a1, const void *a2, size_t size) 

       函数memcmp用于比较字符串s1与s2的前size个字符。

      如果两上字符块相同,memcmp将返回0。

函数:int strcmp (const char *s1, const char *s2) 

       这个函数用来比较s1和s2字符串,这个函数将返回一个值,它的符号与第一对不同的字符的比较结果相关。

      如果两个字符串相等的话,strcmp将返回0。

       如果s1是s2的一个子串的话,s1小于s2

此外还有函数 

    int strncmp (const char *s1, const char *s2, size_t size) 

    此函数与strcmp极为类似。不同之处是,strncmp函数是指定比较size个字符。也就是说,如果字符串s1与s2的前size个字符相同,函数返回值为0。

 

功能比较:

 

     二者都可以用于字符串的比较,但是二者是有比较大的差异的,因为strcmp是按照字节(byte-wise)比较的,并且比较的过程中会检查是否出现了"/0"结束符,一旦任意一个字符串指针前进过程中遇到结束符,将终止比较。而memcmp函数是用于比较两个内存块的内容是否相等,在用于字符串比较时通常用于测试字符串是否相等,不常进行byte-wise的字符串比较。如果要比较的对象中包含一些由于边界对齐需求而填入结构对象中的空格、联合 (union)结束的额外空格、字符串所分配的空间未使用完的部分引起的“holes”的话,最好使用memcmp来完成。这些“holes”的内容是不确定的,在执行byte-wise比较时结果也是不明确的。

 

效率差异:

     strcmp比较的字符串,而memcmp比较的是内存块,strcmp需要时刻检查是否遇到了字符串结束的 /0 字符,而memcmp则完全不用担心这个问题,所以memcmp的效率要高于strcmp

 

使用示例:

 

给出一个如下的结构定义:

struct foo
{
    unsigned char tag;
    union
    {
        double f;
        long i;
        char *p;
    } value;
};

      如果要比较两个struct foo对象的话,建议最好使用memcmp。

     在给出一个字符串比较的例子,判断字符串str中前四个中字符是否为 0x80100001,因为0x00对于字符串而言,这是个结束符,如果使用strncmp的话strncmp(str,"/x80/x10/x00 /x01",4)的话,实际效果是只判断了是否含有0x8010,也就是说一旦str中前两个字符为0x8010就返回0,表示相同了,显然这是不正确的!此时应该使用memcmp(str,"/x80/x10/x00/x01",4),这样一来就达到了目的


 

posted on 2022-10-04 01:31  bdy  阅读(423)  评论(0编辑  收藏  举报

导航