使用函数进行数组越界检查

3
我刚开始学习C编程,我的作业有两个问题,我想问一下我做错了什么(我的助教说我做错了两件事)。我必须使用这两个函数。(抱歉问题有点长,我也是第一次使用这个网站,不知道这是否合适)。
以下是我的作业中给出的数字以及我的插入和第二个代码。
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

void insert(int a[], int size, int key, int k){

    a[k] = key;

}

我的TA说我没有检查k是否在索引范围内,我对如何检查有些困惑。我想知道如何检查,因为我知道这对于我的专业未来项目很重要。

对于第二个函数,我需要获取数组中最大的第二个元素并将其放入第零个元素。唯一的问题是它将12放入第零个元素而不是11。我从未理解如何做到这一点。

void second(int a[], int size){

int j = 0;

int b, c, i = 0;

int temp = 0;

int pos,pos1;

for ( b = 0; b<(size-1); b++){
    if(a[b] < a[b+1]){
        pos = b+1;
    }
}
for (b = 0; b<(size-1); b++){
    if ( a[i] < a[b+1] && pos != b-1){
        pos1 = b+1;
        i++;
    }

    temp = a[0];
    a[0] = a[pos1];
    a[pos1] = temp;
}

谢谢你的帮助!(其他评论也可以,例如如果我的编码不好,我认为是这样的)。

在你的 second() 函数中,我不确定你的算法是什么。它不太清楚,但假设数组中的数据没有排序。如果不幸的是,数据按相反的顺序排列,因此 a[0] >= a[1] && a[1] >= a[2] && … && a[size-2] >= a[size-1],那么 pos 将不会被设置。如果它被设置了,它将是一个早期元素比其隔壁后续元素大的最后位置。这显然没有用处。如果您不先对数组进行排序,则需要进行某种诡计,例如 int min1 = a[0]; int min2 = a[0]; for (int b = 1; b < size; b++) { if (a[b] > min2) { … } } - Jonathan Leffler
啊,谢谢。我明白你的意思了。 - SoonPro
我点赞了一个作业问题!我正在收藏这个事件。 - Martin James
2个回答

5
是的,你的TA是正确的,你应该检查索引是否在数组的范围内。
void insert(int a[], int size, int key, int k) {
    if (k < 0 || k >= size) {
        // error: k out of bound!
        return;
    }
    a[k] = key;
}

要在数组中找到第二大的元素,并将其放入a [0]中,您可以在循环的一次遍历中完成此操作:

void second(int a[], int size) {
    int first, second;
    int i;

    first = 0;
    second = 0;
    for (i = 0; i < size; i++) {
        if (a[i] > a[first]) {
            second = first;
            first = i;
        } else if (a[i] > a[second] && a[i] != a[first])
            second = i;
    }

    int temp = a[0];
    arr[0] = a[second];
    a[second] = a[0];
}

1
为了追踪第二大的元素,必须先追踪最大的元素,所以每当发现一个比最大值还要大的元素时,它就成为了最大值,而原来的最大值则变成了第二大的元素。但是,当这个元素比最大值小但比第二大的元素大时,最大值保持不变,但需要将第二大的元素更新为这个元素。 - fluter
谢谢。我理解一切。 - SoonPro

3

第一个问题: 检查k是否在0..(size-1)的范围内。

if ((k>=0)&&(k<size))
    a[k] = key;

第二个问题: for 循环应该是到 size,而不是到 size-1。 尝试在 if 语句中对术语进行分组:
if ( (a[b] < a[b+1]) && (pos != b-1))

所以,第一个for循环应该是for (b = 0; b<size; ...),两个if语句都是吗?因为其中一个我已经将它们分组了。 - SoonPro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接