c - 了解为什么它在数组中找不到重复项
问题描述
我在 C 中编写了以下函数:
int last(long arr[], int length) {
for (int i = 0; i < length-1; i++)
if (*(arr+i) == *(arr + length - 1))
return 1;
return 0;
}
它检查数组的最后一个值是否被多次使用。主要是:
int *arr = malloc(length*sizeof(int));
for (int i = 0; i < length; i++)
scanf("%d", ++arr);
printf(last((long *) arr, length);
由于数组的某种原因,[1,2,2,3]
它返回最后一个元素被多次使用,我不知道为什么。我认为这是因为scanf("%d", ++arr);
但我不知道如何解决它。我的目标是它将返回1
for[1,3,2,3]
和0
for [1,2,2,3]
。可能是什么问题呢?
解决方案
你应该使用scanf("%d", &arr[i]);
. Using++arr
会导致数组在传递给 之前递增last
,并且还会读入超出 的数据arr
,这是未定义的行为。
另一个问题是演员阵容long *
。
您应该使用%ld
inscanf
和long *arr = malloc(length*sizeof(*arr));
.
还要确保检查NULL
. 你永远不知道什么时候malloc
会失败或有人会传递不良数据。
完整示例:
#include <stdio.h>
#include <stdlib.h>
int last(long arr[], int length) {
if(!arr) return -1;
for (int i = 0; i < length-1; i++)
{
if (arr[i] == arr[length-1])
return 1;
}
return 0;
}
int main(void)
{
long *arr = malloc(4*sizeof(*arr));
if(!arr) return 1;
for (int i = 0; i < 4; i++)
scanf("%ld", &arr[i]);
printf("%d\n", last(arr, 4));
}
推荐阅读
- reactjs - 如何在 React.js 中自定义外部库组件
- android - 调试 .NET MAUI android 应用程序时断点未命中
- haproxy - 使用数据平面 api 在 haproxy 中更新 env 变量(setenv)
- c# - 在运行时按需下载/安装稀有功能的库
- c# - IIS 上的 TelegramBotClient HttpRequestException
- python-3.x - pyinstaller exe 等待用户在命令提示符下输入任何键,然后继续下一次迭代。如何在不输入任何密钥的情况下保持运行
- redirect - Access-Control-Allow-Origin 等于 origin 但浏览器仍然拒绝访问...为什么?
- azure - Azure Logic 使用 Outlook 连接器作为组发送电子邮件
- python - 如何在熊猫中设置具有多个日期的多索引?
- c# - 尝试在 C# selenium 中使用 Webdriver Manager 下载 msedge 驱动程序时出现错误