Онлайн компилятор C

#include <stdio.h> enum { SIZE = 10 }; int main() { int A[SIZE]; for (int i = 0; i < SIZE; i++) { scanf("%d", &A[i]); } for (int i = 0; i < SIZE; i++) { for (int j = i + 1; j < SIZE; j++) { if (A[i] > A[j]) { int temp = A[i]; A[i] = A[j]; A[j] = temp; } } } for (int i = 0; i < SIZE; i++) { if (i > 0 && A[i] == A[i - 1]) { printf("%d ", A[i]); while (i < 10 && A[i] == A[i + 1]) { i++; } } } return 0; }
这段代码的功能是:先输入10个整数存入数组,然后用冒泡排序将它们从小到大排序,最后输出排序后数组中所有重复出现的数字(每个重复数字只输出一次)。

代码中存在一个逻辑错误。在输出重复数字的循环中,当遇到重复数字时,你打印了当前数字,然后用一个while循环跳过后续相同的数字。但问题在于,while循环的条件中使用了 `A[i + 1]`,当 `i` 等于9时,`A[i+1]` 会访问数组越界,导致未定义行为。

- 检查 while 循环的边界条件,确保在访问 `A[i+1]` 之前先判断 `i` 是否已经到达数组末尾。
- 思考一下,当 `i` 已经指向最后一个元素时,是否还需要进入 while 循环?