为什么 c 中的数组不交换最后一个元素
why the array in c does not swap the last elements
我不知道这个程序发生了什么,
我正在用这个函数修改一个包含 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");
}
感谢您的帮助
修复
最后一个for循环有问题。当您分配 int i = 3
时,内部的第二个 for 循环将永远不会 运行 因为 3 < 6-3-1
为假。从上面复制外循环:
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;
}
不要总是先想到什么就满足 ;)
我不知道这个程序发生了什么, 我正在用这个函数修改一个包含 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");
}
感谢您的帮助
修复
最后一个for循环有问题。当您分配 int i = 3
时,内部的第二个 for 循环将永远不会 运行 因为 3 < 6-3-1
为假。从上面复制外循环:
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;
}
不要总是先想到什么就满足 ;)