strcmp和memcmp的使用比较

作用

        strcmp函数是用来比较两个字符串是否相等的,它会逐个字符比较两个字符串,直到找到第一个不同的字符或者两个字符串都结束。而memcmp函数是用来比较两个内存区域是否相等的,它会逐个字节地比较两个内存区域,直到找到第一个不同的字节或者两个内存区域都结束。

        strcmp函数比较的是字符串,而memcmp函数比较的是二进制数据。strcmp函数只能比较字符串类型的数据,而memcmp函数可以比较任意类型的数据。

比较

        memcmp函数通常比strcmp函数更快,strcmp函数还需要处理字符串结束符\0,而memcmp函数没有这个限制。strcmp函数需要逐个字符比较,而memcmp函数可以比较整个内存区域。但是需要注意strcmp函数会自动终止比较,当遇到\0字符时会停止比较,而memcmp函数不会,它会比较指定的字节数。所以在将strcmp替换成memcmp时,需要先获取数据大小,然后再使用memcmp函数进行比较。

使用

      如果想将strcmp替换成memcmp,需要知道传入数据的size是多大。

      a 对于字符串数据,可以使用strlen函数获取字符串的长度,然后使用memcmp函数进行比较。strlen函数仅适用于以\0字符结尾的字符串,如果字符串中包含\0字符,需要使用其他方法获取字符串长度。

       b  对于数组数据,可以使用sizeof函数获取数组的长度,然后使用memcmp函数进行比较。另外,sizeof运算符仅适用于已知大小的数组。如果是动态分配的数组,在malloc分配内存的时候通常就已经将数组大小传入函数了,所以这个大小就是数组长度。如果是动态分配的指针,则因为其只知道指向而不知道指向内容的大小,所以需要将指针指向的内存看作一个数组,然后使用sizeof运算符来获取数组的大小。例如:

int* ptr = (int*)malloc(sizeof(int) * n);
int size = sizeof(*ptr) * n;
// ptr是一个指向整型数组的指针,*ptr表示指针指向的整型元素,因此可以使用sizeof(*ptr)来获取每个元素
// 的大小,然后再乘以n来获取整个数组的大小。

        c 对于结构体数据,可以使用sizeof运算符获取结构体的大小,然后使用memcmp函数进行比较。

结论

        从实际使用角度,在字符串的比较上来说,如果在不知道传入的字符串大小的情况下,先使用strlen获取字符串大小,再使用memcmp函数进行比较这种方式在效率上是比直接使用strcmp函数效率略低的,因为需要先遍历一遍字符串来获取其长度。

        但是在比较前知道字符串长度的情况中。 在两个字符串相等的时,使用memcmp时间复杂度是O(n),其中n是字符串长度。使用strcmp函数的时间复杂度是O(1)。当两个字符串不相等时,使用memcmp函数的时间复杂度是O(n),而使用strcmp函数的时间复杂度是O(min(m,n)),其中m和n分别是两个字符串的长度。

        因此,在字符串长度已知的情况下,使用memcmp函数通常比使用strcmp函数效率更高。但是,在字符串长度未知的情况下,只能使用strlen和memcmp组合来比较字符串,这时效率会略低。

备注:O(n)表示算法执行时间与输入规模n成正比,即当n增加一倍时,算法执行时间也增加一倍。O(1)表示算法执行时间与输入规模n无关,即算法执行时间不随着输入规模n的增加而增加。因此,随着输入规模n的增大,O(n)算法的执行时间会增加,而O(1)算法的执行时间不会增加。所以在比较大规模输入的时候,使用O(1)算法的效率通常更高。

        

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值