c语言中数组的等价性
我必须用整数元素检查两个数组(1-D)的相等性c语言中数组的等价性,c,arrays,C,Arrays,我必须用整数元素检查两个数组(1-D)的相等性 int IsEqual2(int array1[], int array2[], size_t n1, size_t n2) { /* n1 and n2 are number of ints in array1 and array2 respectively */ return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int)); } int
int IsEqual2(int array1[], int array2[], size_t n1, size_t n2)
{
/* n1 and n2 are number of ints in array1 and array2 respectively */
return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int));
}
int main()
{
int arr1[] = { /* whatever */ };
int arr2[] = { /* whatever */ };
is_equal = IsEqual2(arr1, arr2, sizeof(arr1)/sizeof(*arr1), sizeof(arr2)/sizeof(*arr2));
return 0;
}
我明白没有直接的比较方法。所以我在做基本的迭代,检查每个元素是否相等
for ( int i = 0 ; i < len ; i++) {
// Equality check
for(int i=0;i
在C语言中,测试数组相等性的最有效方法是什么?我能以某种方式避开循环(例如…)吗?使用函数比较两个长度相等的数组
int a = memcmp(arr1, arr2, sizeof(arr1));
if(!a)
printf("Arrays are equal\n");
else
printf("Arrays are not equal\n");
您可以使用for循环方法
或者memcmp
也是比较数组的有效方法。
提及
int memcmp(常数空*s1,常数空*s2,大小n)
您可以将前n个字节与此函数进行比较
int array1[5],array2[5];
int x = memcmp(array1, array2, sizeof(array1));
如果阵列大小不同,则:
- sizeof(array1)小于sizeof(array2),它返回负值
- sizeof(array1)大于sizeof(array2),则返回正值
- sizeof(array1)等于sizeof(array2),则返回零
如何使用
?也是如此memcmp
记住
memcmp
只有当内存元素或数组大小相等时才有用正如其他人所说,使用memcmp()
是有效的
假设实际数组,一般的答案是
int is_equal = sizeof(array1) == sizeof(array2) && !memcmp(array1, array2, sizeof(array1));
如果数组作为函数的指针参数提供,那么大小信息将丢失,需要单独提供
int IsEqual(void *array1, void *array2, size_t size1, size_t size2)
{
return size1 == size2 && !memcmp(array1, array2, size1);
}
int main()
{
int arr1[] = { /* whatever */ };
int arr2[] = { /* whatever */ };
is_equal = IsEqual(arr1, arr2, sizeof(arr1), sizeof(arr2));
return 0;
}
或者,在转换为void
指针之前,尽可能晚地保留类型信息(即使用int
数组的知识),并使用元素数
int IsEqual2(int array1[], int array2[], size_t n1, size_t n2)
{
/* n1 and n2 are number of ints in array1 and array2 respectively */
return n1 == n2 && !memcmp(array1, array2, n1 * sizeof(int));
}
int main()
{
int arr1[] = { /* whatever */ };
int arr2[] = { /* whatever */ };
is_equal = IsEqual2(arr1, arr2, sizeof(arr1)/sizeof(*arr1), sizeof(arr2)/sizeof(*arr2));
return 0;
}
您可以使用
memcmp
问题是,我在另一个重循环中执行此操作,因此它非常重。但我使用相等性检查作为约束,因此结果必须带有一个赋值,以确保每个数组元素相等,因此显示的短路技巧不会有多大用处。谢谢punit。@user2754673没有这里是“短路技巧”。考虑到你的问题在很大程度上是另一个问题的重复,这是一个完全有效的答案。这个答案的唯一缺陷是它受到与haccks答案相同的限制(数组大小是否相等?)@punitvara请解释您添加的关于位填充的评论。只要两个数组类型相同,C数组就不会使memcmp
不可靠。我希望现在我已经澄清了提问者的所有疑问:-)注意,像这样使用sizeof运算符,array1必须是数组类型,而不是a指针(例如函数参数)。这仅在已知数组长度相同的情况下有效。如果arr1
比arr2
短,则会产生误报。如果arr1
比arr2
长,则会产生未定义的行为,最有可能是seg错误的形式。@CareyGregory;我没有提到它是有效的吗d表示长度相等的数组。你是这样做的。我忽略了这一点,所以我道歉并收回我的反对票。很难想象如果两个数组的长度不相同,它们怎么可能相等。