1

したがって、整数の 2 つの配列 (a[5] と b[8]) を比較し、ポインターを使用して繰り返される要素をチェックするように求める割り当てがあります。これまでのところ、私が思いついたコードは次のとおりです。

int main(void) {
    int *pa, i, j, sizeA=5, sizeB=8, a[sizeA], b[sizeB], aux[sizeB];
    for (i=0; i<sizeA; i++){
        scanf("%d", &a[i]);
    }
    for (i=0; i<sizeB; i++){
        scanf("%d", &b[i]);
    }
    for (i=0; i<sizeB; i++){
        aux[i] = NULL;
    }
    for(i=0;i<sizeA; i++){
        for(j=0; j<sizeB; j++){
            if ((a[i] == b[j]))
                aux[i] = b[j];
        }
    }
    for(i=0;i<sizeA; i++){
        pa = &aux[i];
        if ((pa != NULL)&&(*pa!=aux[i+1])){
            printf("%d \n", *pa);
        }
    }


    return (EXIT_SUCCESS);
}

エラーなしでコンパイルおよび実行されましたが、繰り返される要素がない場合、最後の for ループは 435304 などの奇妙な値を出力します。

ポインター「pa」が配列「aux」をスキャンし、配列の次の要素とは異なる要素のみを出力し、ポインターが指している位置が空かどうかを確認しようとしました。

任意のヒント?

編集:補助配列をNULL値で初期化して解決しました。それは有効な解決策としてカウントされますか? それを行うより良い方法はありますか?

EDIT2:私を助けてくれたみんなに感謝します. 良い1日を。

4

5 に答える 5

1

auxつまり、auxの内容は B の内容のサブセットになりますが、サイズで宣言し、その内容を初期sizeBしていません。これは、作成時に の内容auxがすべてメモリ ガベージであることを意味します。サブセットの定義により、aux(A = B でない限り) 書き込みなしで の位置を残すため、書き込まれていない位置は書き込まれずに残るため、ガーガベが含まれることになります。問題を回避するために初期化します。

int myArray[10] = { -1 }; //all elements to -1

-1、または空の位置をマークするために使用するその他の値を見つけたら、反復を停止します。

于 2013-08-19T13:33:29.860 に答える
0

から にデータをコピーしているbためaux

if ((a[i] == b[j]))

true の場合はデータをコピーすると述べています。では、あなたの意見を教えてください。

両方の配列で共通のデータを取得していないためです。ガベージ値を出力しています。

ソリューションの場合:

両方の配列に同じデータを提供するだけで、出力が得られます。

于 2013-08-19T13:32:25.580 に答える
0

aux にはデフォルトの値があります

最初に aux のすべての値を 0 に設定するか、または aux が満たされる場所までカウンターを実行します。

于 2013-08-19T13:33:38.977 に答える