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

#include <stdio.h> int find_missing(int n, int a[]) { int min = a[0]; for (int i = 0; i < n; i++) { if (a[i] < min) { min = a[i]; } } int t = min; int c[t] = {0}; while (t < min + n) { c[t]++; t++; } for (int i = min; i < min + n; i++) { if (c[i] == 0) { return i; } } } int main() { int a[1000], answer; while (scanf("%d", a)) { answer = find_missing(10, a); } printf("%d", answer); return 0; }
这段代码试图在一个包含 n 个连续整数的数组中找到缺失的那个数。但代码有几个逻辑和语法问题。

首先,`int c[t] = {0};` 这一行有问题。这里 `t` 是 `min` 的值,但 C 语言中数组的大小必须是编译时常量,不能使用变量。而且你试图用 `t` 作为索引来标记数字,但数组 `c` 的大小是 `t`,而你要访问的索引范围是 `min` 到 `min+n-1`,这很可能超出数组范围。

其次,`while (t < min + n)` 循环中,你递增 `t` 并标记 `c[t]`,但 `t` 的初始值是 `min`,而 `c` 的大小是 `min`,所以当 `t` 大于等于 `min` 时,访问 `c[t]` 就越界了。

另外,`main` 函数中的 `while (scanf("%d", a))` 会一直读取直到输入结束,但每次调用 `find_missing` 时都传入 `10` 作为 `n`,而数组 `a` 可能并没有 10 个有效元素。而且 `scanf` 的返回值是成功读取的项数,不是布尔值,所以循环条件可能不正确。

- 提示1:检查数组 `c` 的大小和索引。你希望用数组 `c` 来标记从 `min` 到 `min+n-1` 的数字是否出现,那么数组 `c` 应该有多大?索引应该如何映射?
- 提示2:`main` 函数中的循环读取方式需要重新考虑。你是一次性读入所有数字,还是每次只读一个?`scanf` 的返回值应该用来判断是否成功读入了一个整数。