使用 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;
}
在上面的程序中,str2
比str1
短。这意味着字符串 str2
被越界访问。
那么,这是未定义的行为吗?
您的代码的行为未定义。 C 标准不要求 memcmp
returns 一旦结果已知;也就是说,尽管 'c' == '[=13=]'
的值是 0
用于该语言支持的任何字符编码。该标准也没有指定进行字典顺序比较的顺序(尽管实现 not 从头开始会很棘手)。
str2
是 char[3]
类型。可能尝试访问第 4 个元素。
是的,您的代码行为未定义。但是,只要您使用 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。
我使用 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;
}
在上面的程序中,str2
比str1
短。这意味着字符串 str2
被越界访问。
那么,这是未定义的行为吗?
您的代码的行为未定义。 C 标准不要求 memcmp
returns 一旦结果已知;也就是说,尽管 'c' == '[=13=]'
的值是 0
用于该语言支持的任何字符编码。该标准也没有指定进行字典顺序比较的顺序(尽管实现 not 从头开始会很棘手)。
str2
是 char[3]
类型。可能尝试访问第 4 个元素。
是的,您的代码行为未定义。但是,只要您使用 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。