在条件中使用数组

时间:2012-08-16 18:32:22

标签: c arrays

我想检查条件中的数组。我们来看下面这个简单的代码:

#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 ===|

那么我应该如何在条件中使用数组?

4 个答案:

答案 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可能会产生错误否定。

在实践中通过以规范化方式初始化对象(例如,在执行成员分配之前使用memset0内存)来避免此问题。 编辑: 即便如此,通过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;
}