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

#include <stdio.h> int main() { char c; int a[200]={0}; int i=0; while((c=getchar())!=EOF){ a[i]=c; i++; } for(int i=0;a[i]!='\n';i++){ printf("%c",a[i]); } return 0; }
这段代码试图从标准输入读取字符,存入数组,然后输出到遇到换行为止。但存在几个问题。

- 数组 `a` 的类型是 `int`,但存储的是字符 `c`,虽然可以工作,但不够直观。更关键的是,循环条件 `a[i]!='\n'` 假设数组中一定有一个换行符,但实际输入可能没有换行符,或者换行符出现在更后面,导致越界访问。
- 变量 `i` 在第一个循环后记录了读取的字符总数,但第二个循环重新声明了 `i`,并且没有使用这个总数作为边界,而是依赖换行符来判断结束,这不可靠。

- 提示1:考虑第二个循环的终止条件。如果输入中没有换行符,或者换行符之前有多个字符,你的循环会继续读取数组未初始化的部分,导致未定义行为。应该用第一个循环记录的字符总数作为循环上限。
- 提示2:注意第一个循环中 `c` 被声明为 `char`,但 `getchar()` 返回 `int`,为了正确检测 `EOF`,通常建议将 `c` 声明为 `int`。