Online Compiler C

#include <stdio.h> int suma(int a[]){ int sum=0,i=0; while(a[i]!='\n'){ sum++; i++; }return sum; } int sumb(int b[]){ int sum=0,i=0; while(b[i]!='\0'){ sum++; i++; }return sum; } int sum(int a[],int b[]){ int sizea=suma(a),sizeb=sumb(b); if(sizea>sizeb){ return sizeb; }else return sizea; if(sizea==sizeb){ int size=sizea; for(int i=0;i<size;i++){ if(a[i]!=b[i]){ return i; } } } return -1; } int main() { int a[1001],b[1001],answer=0; char m,n; int i=0,t=0; while((m=getchar())!='\n'){ a[i]=m; printf("%d",a[i]); i++; } while((n=getchar())!=EOF){ b[t]=n; t++; } answer=sum(a,b); printf("%d",answer); return 0; }
这段代码试图比较两个数组,但存在几个关键问题。

首先,`suma` 函数使用 `'\n'` 作为结束标志,但 `main` 函数中读取第一个数组时确实以换行结束,所以这里可能正确。但 `sumb` 函数使用 `'\0'` 作为结束标志,而 `main` 函数中读取第二个数组时使用 `EOF` 作为结束,这意味着数组 `b` 中并没有 `'\0'` 结束符,因此 `sumb` 会一直读取越界数据,导致错误。

其次,`sum` 函数中的逻辑有问题:在比较大小后,如果 `sizea` 大于 `sizeb` 返回 `sizeb`,否则返回 `sizea`,但之后还有一个 `if(sizea==sizeb)` 的代码块,这个代码块永远不会被执行到,因为前面的 `if-else` 已经覆盖了所有情况并返回了。

- 检查 `sumb` 函数中使用的结束条件是否与 `main` 函数中读取数组的方式一致。`main` 中读取第二个数组直到 `EOF`,但 `sumb` 期待 `'\0'` 结束。
- 思考 `sum` 函数中 `if(sizea>sizeb)` 和 `else` 分支都直接返回了,后面的 `if(sizea==sizeb)` 代码块是否还能执行到?