如何在C编程语言中比较两个数组?

6

我想比较两个不同的数组,它们都是int类型的。一个数组是静态的,包含从1到10的数字,第二个数组要求用户输入10个不同的数字,程序检查两个数组中哪些元素相等。

#include <stdio.h>

int main(void) {
    int array1[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int array2[10];
    int i;

    for (i = 0; i < 11; i++) {
        printf("Enter numbers: ");
        scanf("%d", &array2);
    }

    for (i = 0; i < 11; i++) {
        if (array1[i] != array2[i]) {
            printf("Not equal \n");
        } else {
            printf("They are equal. \n");
        }
    }
}

即使我输入一个与第一个数组中的数字相等的数字,程序仍然会显示不相等。


你输入了什么,看到了什么,期望看到什么? - user253751
2
memcmp是一个选项。 - Inisheer
此外,每次获取输入时,您都在写入相同的array2索引。 - Inisheer
你正在访问越界 - 数组的大小为10,所以循环条件应该是i < 10,而不是i < 11。另外,在scanf行中,你应该使用&array2[i] - M.M
5个回答

4
scanf("%d", &array2);

当从输入框获取值时,您从未更新 array2 的索引。

尝试:

scanf("%d", &array2[i]);

关于比较,您也可以使用memcmp来比较内存:

memcmp(array1, array2, sizeof(array1));

需要加入一些具体的内容吗?当然,比特填充可能是一个问题,但我很少看到它在这样的场景中出现过。 - Inisheer
https://dev59.com/aGox5IYBdhLWcg3wk1Eg - Inisheer
楼主使用的是C语言,C语言允许填充位,这可能会导致错误的memcmp结果。由于楼主没有说明他正在使用没有填充位的平台,而是在与C编程语言相关的问题中发布了该问题。请参见标题和标签。(请使用@,否则我将不会阅读您的回复。) - this

3

数组的起始索引是基于0的。您错误地填充了array2,因此您可能需要将第一个循环更改为以下内容:

    for (i=0;i<10;i++) 
    {
            printf("Enter numbers: ");
            scanf("%d", &array2[i]);
    }

由于您当前的代码只是将array2的地址作为参数传递给scanf函数。

那么请将第二个循环条件更改为:

 for (i=0;i<10;i++) 

在您的比较循环中,请确保不要访问超出数组边界的项。
目前,您的第二个循环正在访问索引0到10处的项 - 但是array1中只有10个项,因此您的当前代码存在未定义的行为。

1
#include <stdio.h>
int main(void) {

        int array1[] = {1,2,3,4,5,6,7,8,9,10};
        int array2[10];
        int i;

        for (i=0;i<10;i++) { //fixed the range here

                printf("Enter numbers: ");
                scanf("%d", &array2[i]); //fixed the indexing
        }

        for (i=0;i<10;i++) { //fixed the range here

                if (array1[i] != array2[i]) {

                        printf("Not equal \n");
                }
                else {
                        printf("They are equal. \n");
                }
        }
}

1

我是一个初学者,我有一个比较两个数组的想法。希望它能帮助像我这样的人。

/***compare two array: all elements are same or not(if not sorted)***/

#include<stdio.h>

int main()
{
    int n;
    scanf("%d", &n);
    
    int array1[n], array2[n];
    int i, j;
    
    for(i=0; i<n; i++)
    {
        scanf("%d", &array1[i]);
    }
    
    for(i=0; i<n; i++)
    {
        scanf("%d", &array2[i]);
    }
    
    int flg=0;
    for(i = 0; i < n; i++)
    {
        for(j=0; j<n; j++)
        {
            if(array1[i] == array2[j])
            {
                flg += 1;
                break;
            }
        }
    }
    if(flg == n)
    {
        printf("All The Elements of array1 is present in array2... :)");
    }
    else
    {
        printf("All THe Elements of array1 is not present in array2 :(");
    }
    return 0;
}

如果任一数组中存在重复元素,则此方法不适用:例如,如果一个数组中有另一个数组的第一个元素的“n”个副本,则诊断“array1的所有元素都在array2中出现”将是不正确的。 - chqrlie

0

我正在尝试回答这个问题,虽然我是一个C程序的初学者。

根据你上面编写的程序,你正在输入和保存值到int array2[10]中,它有11个元素。

请记住,这个数组的第一个元素是从零开始索引的。例如:array2[0],直到它达到最后一个元素array2[10],你已经数了11个。

现在array1有预定义的值,将与你的输入值进行比较。请输入并将你的值存储到array2[]中。

#include <stdio.h>

int main(void) {
    int array1[] = {1,2,3,4,5,6,7,8,9,10};
    int array2[10];
    int i;

    for (i=0;i<10;i++) { //fixed the range here
        printf("Enter numbers: ");
        scanf("%d", &array2[i]); //fixed the indexing

        if (array1[i] != array2[i]) {
            printf("Not equal \n");
        }
        else {
            printf("They are equal. \n");
        }
    }
}

实际上,使用for (i=0;i<(sizeof(array1)/sizeof(int));i++)而不是for (i=0;i<10;i++)可能更有用。 - Tibrogargan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接