c - 循环输入时的数组指针
问题描述
我正在尝试编写一个程序来检查来自可编程手持条形码扫描仪的重复输入,我正在对其进行编程以能够扫描 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;
}
解决方案
您的代码的第一个问题是:
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
独特的元素。
注意:为了检查某些东西是否重复,您需要从开始扫描数组到当前元素数。为了提高性能,您可以考虑另一种方法,例如排序树、哈希表等,这样可以更快地检查重复项。随着数组元素数量的增加,这一点变得更加重要。
推荐阅读
- java - 如何使用 2 维数组创建 tictactoe 板?(不是完整游戏)
- python - 调用操作 Py_buffer 的 python3 扩展模块函数时获取 SIGSEGV
- c# - 我想使用授权级别来保护 azure 功能
- average - 使用 len 和 avg 函数从列表中获取平均值
- django - 如何在 Django 中使用 Ajax 发表评论?
- tkinter - GUI tkinter / 我的主窗口覆盖了我创建的 toplavel
- react-native - [expo-ads-admob][IOS [Android works]] - 奖励添加立即关闭
- static - 在此处获取“不能从静态上下文中引用非静态方法”
- networking - VyOS中如何在两个接口之间建立路由
- javascript - 如何在 NodeJS 中访问 SQL 请求的结果?