c - 数组指针 while 循环输入

标签 c arrays pointers while-loop

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

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

示例: int Array [10];

我想在第一个循环中将 scanf() 放入数组 location 0 然后每次递增 1 个位置到 location 2 等等while 循环运行。请帮忙,非常感谢你的帮助。

#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;
}

最佳答案

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

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]);
    }

所以最后您的程序调用 scanf 2000 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 个独特的元素。

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

关于c - 数组指针 while 循环输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57984336/

相关文章:

c++ - 防止通过指针调用成员函数

c - 指针指针的字节大小?

c - 为什么在 C 语言中退出 do-while 循环请求输入后程序会崩溃?

c++ - 我如何在 ubuntu C/C++ 中生成带有 exuberant ctags 的标签文件,包括与 vim 一起使用的目录?

ruby-on-rails - 从 ruby​​ 中的数组中删除重复项

c - 二维数组添加额外的字符

c - 为什么 #define NUM_EMPLOYEES 20;使用时给出语法错误?

c - 机器人寻路算法

创建通用数组时发生 Java 类转换异常

c++ - std::optional 的 const_cast 等价物