怪异的阵列输出

时间:2017-03-24 07:15:08

标签: c

好吧我在这里做错了什么?

该程序应该读取20个整数,然后输出不重复的整数数组(仅输出每个整数一次)。

//Program to read 20 integers and return each integer only once (no duplicates).
#include <stdio.h>

int main()
{
    int a, b, count=0, temp, array1[20];

    printf("Enter 20 array elements between 1 and 10 inclusive\n");
    for (a=0; a<20; a++) //Loop to enter 20 elements
    {
        scanf("%d", &temp);
        for (b=0; b<=20; b++) //Loop to test each new element against all previous entered elements
    {
        if (array1[b] == temp) //If duplicate increment count
        {
            count++;
        }
        else if (count == 0 && b == 20) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array
        {
            array1[a] = temp;
        }
    }
}
for (a=0; a<20; a++)
{
    printf("%d\t", array1[a]);
}
return 0;

}

2 个答案:

答案 0 :(得分:2)

这里有以下错误。

  1. 在内部循环中,在第一次检查期间,您将与20个元素进行比较。收到第一个元素后,您没有任何要比较的元素。我添加了一个变量size来表示数组的大小。 size初始化为0。

  2. if (count == 0 && b == 20)应移至for循环之外,并可简化为if (count == 0)

  3. 将一个元素添加到数组时,它会在array1[size]添加,size会增加。

  4. 您需要在每个外部for循环重新初始化count,如下所示。

  5. 打印将打印不重复的size个元素。

  6. 代码如下。

    //Program to read 20 integers and return each integer only once (no duplicates).
    #include <stdio.h>
    
    int main()
    {
        int a, b, count=0, temp, array1[20];
    
        int size = 0;
        printf("Enter 20 array elements between 1 and 10 inclusive\n");
        for (a=0; a<20; a++) //Loop to enter 20 elements
        {
            scanf("%d", &temp);
            count = 0;
            for (b=0; b<size; b++) //Loop to test each new element against all previous entered elements
            {
                if (array1[b] == temp) //If duplicate increment count
                {
                    count++;
                }
            }
            if (count == 0) //If there have been no duplicates and 20 numbers have been tested... add entered number to the array
            {
                array1[size] = temp;
                size++;
            }
        }
        for (a=0; a<size; a++)
        {
            printf("%d ", array1[a]);
        }
        return 0;
    }
    

    此代码将接受20个元素并存储和显示尽可能多的非重复元素(可以是1-20)。如果你想存储20个非重复元素(输入可能超过20个),可以很容易地修改它。

答案 1 :(得分:1)

您有多个未初始化变量的读取,这是未定义的行为。您还可以访问超出范围的数组。

for (b=0; b<=20; b++)
           ^^
           This will result in b in the range [0..20]
{
    if (array1[b] == temp) //If duplicate increment count
        ^^^^^^^^^
        array1[b] is uninitialized
        and when b is 20 you access out of range

此外,只有当count为0且b为20

时,才会写入数组
    else if (count == 0 && b == 20)
    {
        array1[a] = temp;
    }

请注意,您永远不会重置count,因此在第一次匹配后您将永远不会再次编写数组

BTW - 你打印:

 Enter 20 array elements between 1 and 10 inclusive

但是你永远不会检查输入值是否在该范围内。