我想检查条件中的数组。我们来看下面这个简单的代码:
#include <stdio.h>
int main()
{
int array[] = {1,2,3,4,5}; // initializing an array
if(array[] == {1,2,3,4,5}) // using as condition
{
printf("worked");
}
else printf("not worked");
return 0;
}
但是它给出了一个错误:
In function 'main':|
C:\Python32\Untitled4.c|5|error: expected expression before ']' token|
||=== Build finished: 1 errors, 0 warnings ===|
那么我应该如何在条件中使用数组?
答案 0 :(得分:5)
如果你有一个现代的C编译器,至少是C99,你可以使用复合文字和函数进行比较:
if(memcmp(array, (int[]){1,2,3,4,5}, sizeof array) == 0) {
printf("worked");
}
memcmp
(内存比较)比较两者的数据
指针点。(int[]){1,2,3,4,5}
是复合文字,类似()
中的类型,然后是{ }
中的初始值设定项,就像您在变量声明中一样。 编辑:正如Eric正确评论的那样,memcmp
只是一个有效的比较,如果你的数组的基类型(这里是int
)没有填充位或字节。对于int
这些日子来说这种情况并不常见,所以我所描述的在通常的平台上都很好。如果有一天你有其他更复杂的数据类型,你必须为这种类型的数组编写自己的比较函数。
答案 1 :(得分:4)
此格式:
int array[]={1,2,3,4,5};
只能在初始化或数组或结构中使用。这称为聚合初始化。这不能用于表示数组。
此外,您无法使用==
来比较C中的数组或结构。
要编码您的条件,您需要检查每个值。
答案 2 :(得分:4)
“您可以使用=
进行分配,但不能与==
进行比较的另一个示例是struct
类型。
struct S {
int array[5];
};
struct S a = { { 1, 2, 3, 4, 5 } };
struct S b;
b = a; /* assignment ok */
if (b == a) { /* equality not ok */ }
那么我应该如何在条件中使用数组?
您可以使用 memcmp
。
if (memcmp(b.array, a.array, sizeof(b.array)) == 0) { /* ... */ }
编辑:请注意memcmp
执行两个内存位置的逐字节比较。正如Eric所指出的,如果您的对象具有不同值的填充位,或者您的类型具有相同值的多个位表示,则memcmp
可能会产生错误否定。
在实践中通过以规范化方式初始化对象(例如,在执行成员分配之前使用 编辑: 即便如此,通过memset
到0
内存)来避免此问题。memcmp
进行比较仍可能产生误报。执行比较的最大可移植方式是通过将每个相应的成员相互比较。 (Follow the link for the gory details)。的
您可以创建一个辅助函数,以便更轻松地执行此操作:
/* API as memcmp, but memory treated like array of int, remainder bytes ignored */
int memcmp_int (const void *a, const void *b, size_t sz) {
const int *aa = a;
const int *bb = b;
while (sz >= sizeof(int)) {
if (*aa < *bb) return -1;
if (*aa > *bb) return 1;
++aa;
++bb;
sz -= sizeof(int);
}
return 0;
}
然后,可以非常简单地修改代码:
if (memcmp_int(b.array, a.array, sizeof(b.array)) == 0) { /* ... */ }
答案 3 :(得分:2)
您需要遍历数组。一个简单的循环看起来像这样:
#include <stdio.h>
int main()
{
int array[] = {1,2,3,4,5}; //initializing an array
int iter = 0;
for (; iter < sizeof(*array); iter++){
printf("Iteration: %i\n", iter);
// TOOD: Add your condition here
}
return 0;
}