3

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

#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

4 回答 4

5

如果你有一个现代 C 编译器,至少是 C99,你可以使用复合文字和函数来进行比较:

if(memcmp(array, (int[]){1,2,3,4,5}, sizeof array) == 0) {
   printf("worked");
}
  • 这里memcmp(内存比较)比较两个指针指向的数据。
  • (int[]){1,2,3,4,5}是复合文字,类型为 in (),然后是初始化器 in ,{ }就像在变量声明中一样。
  • 当像在这样的表达式中使用时,这两个数组被转换为指向它们的第一个元素的指针

编辑:正如 Eric 正确评论的那样,memcmp只有当您的数组的基本类型(这里是int)没有填充位或字节时,它才是有效的比较。因为int这在当今并不常见,所以我所描述的在通常的平台上都很好。如果有一天您有其他更复杂的数据类型,您将不得不为该类型的数组编写自己的比较函数。

于 2012-08-16T18:44:22.483 回答
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仍可能产生假阴性。执行比较的最大可移植方式是将每个对应的成员相互比较。(点击链接了解血腥细节。)

您可以创建一个辅助函数来简化此操作:

/* 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) { /* ... */ }
于 2012-08-16T18:39:14.137 回答
4

这种格式:

int array[]={1,2,3,4,5};

只能在初始化或数组或结构中使用。这称为聚合初始化。这不能用于一般表示数组。

此外,您不能用于==比较 C 中的数组或结构。

要对您的条件进行编码,您需要检查每个值。

于 2012-08-16T18:33:41.673 回答
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;
}
于 2012-08-16T18:46:25.103 回答