c-如何比较两个数组,看看它们是否相同



我试图逐元素比较两个数组,看看它们是否相同。我可以让它适用于所有情况,除了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 = 3int 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.
}

相关内容

  • 没有找到相关文章

最新更新