在数组上获取无效位置

问题描述 投票:2回答:2

我正在编写一个程序,该程序读取一个值列表以及3个值,a,b和elem。我写了一个函数来查找元素是否是位置a和b之间的数组的一部分。当我运行程序时,有时我得到正确的结果,有时我得到错误的结果。我找不到错误。任何帮助都将受到欢迎。

int binary_search(int *v, int elem, int a, int b);

int main()
{
    printf("Inserire la lunghexza di N:\n");
    int N;
    scanf("%d", &N);
    printf("Inserire i valori dell'array:\n");
    int arr[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    int a,b,elem;
    printf("Inserire i valori di a, b, elem:\n");
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &elem);
    printf("%d", binary_search(arr,elem,a,b));
    return 0;
}

int binary_search(int *v, int elem, int a, int b)
{
    for (int i = 0; i < i < b - a; i++) {
        if (*(v + a - 1 + i) == elem) {
            return a + i;
        }
    }
    return -1;
}
c arrays pointers
2个回答
2
投票

[就像阿德里安已经指出的那样,这行看起来很奇怪:

for (int i = 0; i < i < b - a; i++)

您的意思是:

for (int i = 0; i < b - a; i++)

0
投票

正如另一个答案已经指出的那样,i < i < b - a循环条件中的表达式for很奇怪,但不能解释原因?

for (int i = 0; i < i < b - a; i++)
                ^^^^^^^^^^^^^

您是否在此表达式上收到任何编译器警告?如果是,则有一个建议-警告由于某种原因存在,请不要忽略它们。

在表达式i < i < b - a中,假设b - a产生x。因此,表达式i < i < x将被计算为(i < i) < x (因为运算符<的关联从左到右),其中(i < i)始终为false,整个表达式将始终为对于满足条件trueab的所有有效**值,并且如果b > a值不存在于数组中,则归因于此条件

elem

您的程序最终无法访问数组,这是未定义的行为。

因此,首先通过删除多余的if (*(v + a - 1 + i) == elem) { ^^^^^^^^^^^^^^^^ 来纠正for循环条件:

i <

现在,使用此循环,循环将检查从数组中的for (int i = 0; i < b - a; i++) th元素到a th元素的值。

此外,与您当前的b - 1版本相比,以下内容更具可读性:

binary_search()

程序中存在另一个问题-**您的程序未检查用户输入int binary_search(int *v, int elem, int a, int b) { for (int i = a - 1; i < b; i++) { if (v[i] == elem) { return i; } } return -1; } a的有效性。用户可能不小心输入了b和/或a的值,该值不在数组范围内或为负值或b的值大于a等。您应检查是否有效。用户输入也是如此。

PS:我假设您非常了解以下事实:在您的程序中,b函数正在执行线性搜索,而二进制搜索需要按排序顺序输入数组。

© www.soinside.com 2019 - 2024. All rights reserved.