首页 > 解决方案 > 循环输入时的数组指针

问题描述

我正在尝试编写一个程序来检查来自可编程手持条形码扫描仪的重复输入,我正在对其进行编程以能够扫描 2000 个条形码。

我是 c 编程的新手,我试图接受一个输入并将其放入数组中,并在每个循环中增加指向下一个的指针。

例子: int Array [10];

我想在第一个循环上scanf()进入数组位置 0 ,然后每次 while 循环运行时增加 1 个位置到位置 2等。请帮助,非常感谢您的帮助。

#include <stdio.h>

int main ()
{
    int i,j,k=1,arr[2000],ArrSize=2000;

    //Welcome message
    printf("Welcome to Yamato Transport (S) Pte. Ltd.\n");
    printf("Barcode checker Ver 1.0\n");

    while (k>=2000,k++)
    {
        //Scanner Input
        for(i=0;i<ArrSize;i++)
        {
        scanf("%d",&arr[i]);
        }

        //Duplicate Logic
        printf("Duplicate Barcodes: ");
        for(i=0; i<ArrSize; i++)
        {
            for(j=i+1;j<ArrSize;j++)
            {
            if(arr[i]==arr[j])
            {
            printf("%d\n",arr[i]);
            }
        }
        }
        //Remove single duplicate

        //Clear Screen

    }
  return 0;
}

标签: carrayspointerswhile-loop

解决方案


您的代码的第一个问题是:

int i,j,k=1,...

...

while (k>=2000,k++)
        ^^^^^^
        ups...

这将给出警告“逗号表达式的左手操作数无效”,这实际上意味着该行与以下内容相同:

while (k++)

这将一直循环,直到你有整数溢出(这是未定义的行为)。所以你不想那样做。

由于您初始化k为 1,我假设您想要这样做:

while (k++ < 2000)

现在让我们假设您想要:

while (k++ < 2000)  // Will loop approx 2000 times
{
    //Scanner Input
    for(i=0; i< ArrSize; i++)  // Will loop 2000 times
    {
        scanf("%d",&arr[i]);
    }

所以最后你的程序调用了scanf2000 x 2000 = 4.000.000 次。那是你要的吗?外部的目的while尚不清楚。

您的程序首先读取 2000 个整数,然后您似乎想要删除重复项。这是一种不好的方法,因为每当您需要从数组中删除重复元素时,您可能会结束大量内存移动。

更好的方法是在将新扫描的值插入数组之前检查它是否是重复的。这可能看起来像:

    for(i=0; i < ArrSize; )
    {
        int tmp;
        if (scanf("%d", &tmp) != 1) 
        {
            // Input error
            exit(1);
        }

        // Check if tmp is already in the array
        int duplicate = 0;
        for (int j = 0; j < i; ++j)
        {
            if (tmp == arr[j])
            {
                duplicate = 1;
                break;
            }
        }
        if (duplicate)
        {
            printf("dup found\n");
        }
        else
        {
            arr[i] = tmp;
            ++i;
        }
    }

这应该给你ArrSize独特的元素。

注意:为了检查某些东西是否重复,您需要从开始扫描数组到当前元素数。为了提高性能,您可以考虑另一种方法,例如排序树、哈希表等,这样可以更快地检查重复项。随着数组元素数量的增加,这一点变得更加重要。


推荐阅读