2

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

做同样的事情

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

buf并且buf2是 char* 数组或类似的。

我打算将此附加到另一个问题,但后来决定单独发布它可能会更好。大概答案是微不足道的“是”,或者如果不是,那么有什么区别?

(我从在线文档中找到了这些功能,但不确定,strncmp因为文档有点不清楚。)

4

3 回答 3

6

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

memcmp(),另一方面,用于比较随机存储器块。无论字节的值如何,它都会比较每个块中指定数量的字节,直到找到差异。也就是说,它不会在字符串终止符处停止。

于 2016-07-31T19:34:23.250 回答
2

strncmp()和之间的主要区别在于memcmp(),第一个对(在)最新的不是明智的。如果前 7 个字节的内存来自并且其中不包含 a ,那么行为是相同的。'\0'bufbuf2'\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],它会在哪里找到 a '\0', wherememcmp()将继续,直到所有 7 个字节都被比较。

于 2016-07-31T19:36:21.340 回答
2

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

与此相反,strncmp即使尚未达到传递的要比较的字节数,该函数也会在值为 0 的字节处停止。

于 2016-07-31T19:31:24.220 回答