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(メモリ比較)は、2つのポインタが指すデータを比較します。
  • (int[]){1,2,3,4,5}は複合リテラルであり、変数の宣言にあるように、タイプがinで()、次に初期化子がinになっています。{ }
  • このような式のように使用すると、2つの配列は最初の要素へのポインタに変換されます

編集: Ericが正しく述べているように、memcmpこれは、配列の基本タイプ(ここではint)にパディングビットまたはバイトがない場合にのみ有効な比較です。これはint最近では珍しいことなので、私が説明することは通常のプラットフォームでは問題ありません。いつか他のより複雑なデータ型がある場合は、その型の配列に対して独自の比較関数を作成する必要があります。

于 2012-08-16T18:44:22.483 に答える
4

この形式:

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

初期化または配列または構造体でのみ使用できます。これは、集約初期化と呼ばれます。これは、一般的に配列を表すために使用することはできません。

==さらに、 Cで配列や構造体を比較するために使用することはできません。

条件をコーディングするには、各値を確認する必要があります。

于 2012-08-16T18:33:41.673 に答える
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 2つのメモリ位置のバイトごとの比較を実行することに注意してください。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 に答える
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 に答える