使用strncmp和memcmp

时间:2016-07-31 19:23:47

标签: memcmp strncmp

if(strncmp(buf, buf2, 7) == 0)

做与

相同的事情
if(memcmp(buf, buf2, 7) == 0)

bufbuf2是char *数组或类似的。

我打算将这个问题附加到另一个问题上,但后来又决定将它单独发布更好。据推测,答案要么是一个微不足道的“是”,要么就是没有,那么差异是什么?

(我从在线文档中找到了这些函数,但对strncmp不确定,因为文档略显不清楚。)

3 个答案:

答案 0 :(得分:2)

strcmp()类似,strncmp()用于比较字符串,因此当它在至少一个参数中找到字符串终结符时,它会停止比较。超过该点的任何差异都不会对结果产生影响。 strncmp()的不同之处在于,如果在此之前没有遇到终结符,它也会在指定的字节数后停止比较。

另一方面,

memcmp()用于比较随机存储器块。它会比较每个块的指定字节数,直到找到差异,而不管字节的值如何。也就是说,它不会停留在字符串终结符处。

答案 1 :(得分:1)

在C和C ++中,字符串的结尾由值为0的字节指示。 函数memcmp不关心strig的结束,但在任何情况下都会精确地比较指定的字节数。

与此相反,函数strncmp将停在一个值为0的字节,即使尚未达到要比较的传递字节数。

答案 2 :(得分:0)

strncmp()memcmp()之间的主要区别在于,第一个是明智的到(停止 at)'\0'最新的不是。如果bufbuf2的前7个字节的内存中不包含'\0',那么行为是相同的。

考虑以下示例:

#include <stdio.h>
#include <string.h>

int main(void) {
    char buf[]  = "123\0 12";
    char buf2[] = "123\0 34";

    printf("strncmp(): %d\n", strncmp(buf, buf2, 7));
    printf("memcmp(): %d\n", memcmp(buf, buf2, 7));

    return 0;
}

将输出:

strncmp(): 0
memcmp(): -2

由于strncmp()将停留在buf[3],因此它会找到'\0',其中memcmp()将继续,直到比较所有7个字节。