使用 memcmp 比较两个字符串文字

Comparing two string literals using memcmp

我使用 memcmp 函数比较了两个字符串文字。

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

int main() 
{
  char str1[] = "abcd";
  char str2[] = "ab";

  if (memcmp(str1, str2, 4) == 0) 
  {
    printf("equal string\n");
  }
  return 0;
}

在上面的程序中,str2str1短。这意味着字符串 str2 被越界访问。

那么,这是未定义的行为吗?

您的代码的行为未定义。 C 标准不要求 memcmp returns 一旦结果已知;也就是说,尽管 'c' == '[=13=]' 的值是 0 用于该语言支持的任何字符编码。该标准也没有指定进行字典顺序比较的顺序(尽管实现 not 从头开始​​会很棘手)。

str2char[3] 类型。可能尝试访问第 4 个元素。

参考:http://en.cppreference.com/w/c/string/byte/memcmp

是的,您的代码行为未定义。但是,只要您使用 if (memcmp(str1, str2, 3) == 0)(请注意字节数是 3 而不是 4。即最少两个),您的代码行为就是可以接受和正确的。

The behavior is undefined if access occurs beyond the end of either object pointed to by lhs and rhs. The behavior is undefined if either lhs or rhs is a null pointer.

如果是 strcmp,它会在找到 [=12=] 时立即停止。但是,对于 memcmp,

it is flawed assumption, that memcmp compares byte-by-byte and does not look at bytes beyond the first point of difference. The memcmp function makes no such guarantee. It is permitted to read all the bytes from both buffers before reporting the result of the comparison.

所以,我会这样写我的代码:

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

#define MIN(X, Y) (((X) < (Y)) ? (X) : (Y))

int main() 
{
  char str1[] = "abcd";
  char str2[] = "ab";
  int charsToCompare = MIN(strlen(str1), strlen(str2)) + 1;

  if (memcmp(str1, str2, charsToCompare) == 0) 
  {
    printf("equal string\n");
  }
  return 0;
}

有关 memcmp 的更多详细信息和分析,请参见 here