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:感谢所有帮助过我的人。祝你今天过得愉快。

4

5 回答 5

1

你的问题是这aux是一个堆栈符号。取它偏移的地址&aux[i]将始终返回非NULL,因为它在堆栈上。您正在获取预定义数组元素的地址。

如果您的意图是保存一个指针,aux那么您需要将它定义为一个数组int *

int * aux[sizeB];
memset(aux, 0, sizeof(aux)); // don't forget to initialise it

当你分配它时,你会在那里分配地址。

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);
        }
    }
于 2013-08-19T13:32:02.950 回答
1

你只写什么等于 on aux,这意味着 的内容aux将是 B 的内容的一个子集,但是你用sizeBsize声明它而不是初始化它的内容。这意味着在创建时,其内容aux都是内存垃圾。因为,根据子集定义,您将留下不写的位置aux(除非 A = B),未写的位置保持不写,因此最终包含 gargabe。初始化它以避免问题:

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

-1并在找到 a或您想用来标记空位置的任何其他值时停止迭代。

于 2013-08-19T13:33:29.860 回答
0

您应该正确初始化 aux (默认情况下 c 不会用零填充数组,这是您奇怪值的来源)并添加一个计数器来计算您找到的匹配数,而不是i < sizeA在最后一个循环中使用。

于 2013-08-19T13:31:46.920 回答
0

由于您正在将数据从 复制baux.

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

表示如果为真则复制数据。那么告诉我们你的意见是什么?

由于您没有在两个数组中获得公共数据。它正在打印垃圾值。

对于解决方案:

只需在两个数组中提供相同的数据,您就会得到输出。

于 2013-08-19T13:32:25.580 回答
0

aux 具有默认值

首先将 aux 的所有值设置为 0 或运行计数器直到填充 aux 的位置

于 2013-08-19T13:33:38.977 回答