我试图逐元素比较两个数组,看看它们是否相同。我可以让它适用于所有情况,除了len=0时。我似乎不能说两个数组a={}和b={}是相同的。
这就是我目前拥有的
int identical( int a[], int b[], unsigned int len )
{
int same=0;
for( unsigned int i=0; i<len; i++ )
{
if(len==0)
{
same=1;
}
if (a[i]==b[i])
{
same=1;
}
else{
same=0;}
}
return same;
}
这真的很简单
int identical(int *a, int *b, unsigned int len) {
for (unsigned int i = 0 ; i < len ; ++i) {
if (a[i] != b[i])
return 0;
}
return 1;
}
正如您所看到的,您不需要迭代所有的值,一旦您在另一个数组中找到一个不等于其对应值的值,您就会立即返回0
,否则总是返回1
,包括当len == 0
时,因为在这种情况下,将有0次迭代,代码将直接跳到return 1
语句。
下面是您编写的代码,让我们一步一步地看看它有什么问题。例如len = 3
和int a[3] = {1,2,3}
int b[3] = {4,5,3}
,这些数组是相同的吗?不,它们不是。
了解您的代码为什么不起作用被认为是一种很好的做法,所以让我们看看您的代码对此有何看法。
您的代码
int identical( int a[], int b[], unsigned int len ){
int same=0; //same is Initialised to 0
for( unsigned int i=0; i<len; i++ ){
if(len==0){ //As len is not zero this condition is not true
same=1;
}
if (a[i]==b[i]){ //For i = 0 , a[0]!=b[0] same stays `0`
//Comes Another iteration a[1]!=b[1] same stays `0`
//Comes Last Iteration a[2]==b[2] if is executed same becomes 1
same=1;
}
else{
same=0;}
}
return same; //Function Returns 1
}
所以你的代码返回1
,在上面的情况下,你知道为什么它是正确的,不,它不是,在你的代码中,它比较两个元素,如果它们相同,它就会改变same = 1
,所以实际上它告诉你的是最后一个元素是否相同,因为循环执行,在最后一个阶段,如果元素相等,那么same = 1
,如果不相等,那么它就是same = 0
。
对于您的len = 0
条件,循环从不执行,因为行for( unsigned int i=0; i<len; i++ )
,i = 0
,如果是i<len
,则循环开始,而对于len = 0
,则循环从不开始。
您应该做的是初始化一个变量same = 1
,如果元素不相等,则将其更改为零,并将循环中断为一个不同的元素就足以说明数组不相同,如果相同的元素变成1
,则您知道每个元素都是相同的。
以下是代码
校正后
int identical( int a[], int b[], unsigned int len ){
int same = 1;
if(len==0) //For len = 0 , we make another condition because
return same; //below loop never executes for len = 0.
for (unsigned int i = 0 ; i < len ; ++i) {
if (a[i] != b[i]){
same = 0; //As Soon as a element differ same becomes 0 and loop break.
break;
}
}
return same; //same = 1 returns if no element differ
//same = 0 returns if a single element differ.
}