做
if(strncmp(buf, buf2, 7) == 0)
做同样的事情
if(memcmp(buf, buf2, 7) == 0)
buf
并且buf2
是 char* 数组或类似的。
我打算将此附加到另一个问题,但后来决定单独发布它可能会更好。大概答案是微不足道的“是”,或者如果不是,那么有什么区别?
(我从在线文档中找到了这些功能,但不确定,strncmp
因为文档有点不清楚。)
Like strcmp()
,strncmp()
用于比较字符串,因此当它在至少一个参数中找到字符串终止符时它会停止比较。超过该点的任何差异都不会影响结果。 strncmp()
不同之处在于,如果在此之前没有遇到终止符,它也会在指定的字节数之后停止比较。
memcmp()
,另一方面,用于比较随机存储器块。无论字节的值如何,它都会比较每个块中指定数量的字节,直到找到差异。也就是说,它不会在字符串终止符处停止。
strncmp()
和之间的主要区别在于memcmp()
,第一个对(停在)最新的不是明智的。如果前 7 个字节的内存来自并且其中不包含 a ,那么行为是相同的。'\0'
buf
buf2
'\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 个字节都被比较。
在 C 和 C++ 中,字符串的结尾由值为 0 的字节指示。该函数memcmp
不关心字符串的结尾,但在任何情况下都会准确比较指定的字节数。
与此相反,strncmp
即使尚未达到传递的要比较的字节数,该函数也会在值为 0 的字节处停止。