Online Compiler C

#include <stdio.h> int suma(char a[]){ int sum=0,i=0; while(a[i]!='\n'){ sum++; i++; }return sum; } int sumb(char 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!=b){ 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'` 作为结束条件,而 `sumb` 用 `'\0'` 作为结束条件,这会导致两个函数对数组长度的理解不一致。在 `main` 中,第一个数组的输入以换行符结束,但 `suma` 检查的是 `'\n'`,而实际存储时换行符并没有被存入数组,所以 `suma` 会一直越界读取直到遇到内存中的 `'\n'`,这是未定义行为。

其次,`sum` 函数中,当两个数组长度不同时,只返回较小的长度,但没有进行元素比较。当长度相等时,`if(a!=b)` 比较的是数组地址而不是元素值,这永远为假,所以循环内的 `return i` 永远不会执行。

- 检查 `suma` 和 `sumb` 的循环条件:它们应该使用相同的结束标志,并且要确保数组确实包含那个结束标志。思考一下 `main` 中实际存入数组的是什么字符。
- 在 `sum` 函数中,比较两个数组元素时,需要逐个比较 `a[i]` 和 `b[i]`,而不是比较数组名 `a` 和 `b`。