为什么c中的数组不会交换最后的元素

时间:2018-01-12 17:52:33

标签: c arrays swap

我不知道这个节目发生了什么, 我正在用这个函数修改一个包含6个元素的数组,它应该以这种方式交换元素:

ex array[6]={1,2,3,4,5,6};

输出:

3 2 1 6 5 4

但相反,我得到了:

输出:

3 2 1 4 5 6

你能告诉我我做错了吗?

功能:

void invert (int *buf){
int i,j,swap; 

for (i = 0 ; i < ( 3 - 1 ); i++)
  {
    for (j = 0 ; j < 3 - i - 1; j++)
    {
        swap       = buf[j];
        buf[j]   = buf[j+1];
        buf[j+1] = swap;
    }
  }

for (i =3  ; i < (6 - 1); i++)
  {
    for (j = 3 ; j < 6 - i - 1; j++)
    {
        swap     = buf[j];
        buf[j]   = buf[j+1];
        buf[j+1] = swap;
    }
  }
} 

我像这样打电话给主要人员:

main ( int argc , char * argv [])
{
int k;
int array[6]={1,2,3,4,5,6};
invert(array);
for(k=0;k<6;k++)
    {
        printf("%d ",array[k]);
    }
printf("\n");
}

我赞成你的帮助

1 个答案:

答案 0 :(得分:1)

修复

最后一个for循环乱序。当您分配int i = 3时,第二个for循环内部将永远不会运行,因为3 < 6-3-1为false。从上面复制外部循环:

for (int i = 0; i < 2; i++)
{
    for (j = 3 ; j < 6 - i - 1; j++)
    {
        swap     = buf[j];
        buf[j]   = buf[j+1];
        buf[j+1] = swap;
    }
}

这将产生3 2 1 6 5 4。

提案:

我可以补充一点:你甚至可以更好地实现这个方法。

void invert (int *buf, int len){
    for(int i = 0; i < len/2; i++){
        int temp = buf[i];
        buf[i] = buf[len-i-1];
        buf[len-i-1] = temp;
    }
}

上面反映了一个非常干净的缓冲区。它被称为:

int main(){
    int k;
    int a[6] = {1,2,3,4,5,6};
    invert(a,3);
    invert(a+3, 3);
    for(k=0;k<6;k++)
        {
            printf("%d ",a[k]);
        }
    printf("\n");
    return 0;
}

不要总是满足于想到的第一件事;)