我只需要使用aux变量来反转数组。不仅可以反向打印,而且实际上可以反转其内容。
这是我的代码:
#include <conio.h>
#include <stdio.h>
#define dim 4
int main() {
int v[dim], aux = 0;
for (int i = 0; i < dim; i++) {
scanf("%d", & v[i]);
}
for (int i = 0; i < dim / 2; i++) {
aux = v[i];
v[i] = v[dim - i];
v[dim - i] = aux;
}
for (int i = 0; i < dim; i++) {
printf("%d", v[i]);
}
return 0;
}
但是运行代码后,我得到了1 4 3 2
,我在做什么错了?
示例:
Input: `1 2 3 4`
Output: `4 3 2 1`
答案 0 :(得分:0)
#include <stdio.h>
#define dim 4
int main()
{
int v[dim],aux=0;
for (int i=0; i<dim; i++)
{
scanf("%d", &v[i]);
}
for (int i=0; i<dim/2; i++)
{
aux=v[i];
v[i]=v[dim-i-1];
v[dim-i-1]=aux;
}
for (int i=0; i<dim; i++)
{
printf("%d ", v[i]);
}
printf("\n");
return 0;
}
运行和结果:
$ gcc b.c && ./a.out
1 2 3 4
4 3 2 1
问题是:使用v[dim-i-1]
代替v[dim-i]
,应更改两个位置。
答案 1 :(得分:0)
@CoderDisorder只是一个很小的逻辑错误。您给数组的索引错误。
0
开始并以length-1
结尾,因此在交换值时,您需要将上限索引设为dim-i-1
而不是dim-i
。只是为了使它更易于理解,for
循环的范围从0
到dim/2
,即2
。因此,如果您希望最后一个元素的索引为3,或者比最后一个元素的索引为2,则第二个索引应该为dim-i-1 (4-i-1)
。只需在使用它们的两个地方进行更改,输出就在那里!
代码:
for (int i=0; i<dim/2; i++)
{
aux=v[i];
v[i]=v[dim-i-1]; //observe the change here index is made dim-i-1
v[dim-i-1]=aux; //same change here
}
另一种可能的方式。几乎相同,只是稍有不同,只需将第二个for
循环更改为以下循环,其余的保持不变。 => i < dim/2 - 1
for(int i = 0; i < dim/2 - 1; i++)
答案 2 :(得分:0)
当i
为零时,dim+i
等于dim
,并且v[dim-i]
与超出范围的v[dim]
相同。考虑使用dim - i - 1
:
#include <conio.h>
#include <stdio.h>
int main()
{
const size_t dim = 4; // size_t is more suitable
int v[dim],aux=0;
for (int i=0; i<dim; i++)
{
scanf("%d", &v[i]);
}
for (int i=0; i<dim/2; i++)
{
aux=v[i];
v[i]=v[dim - i - 1];
v[dim - i - 1]=aux;
}
for (int i=0; i<dim; i++)
{
printf("%d", v[i]);
}
return 0;
}
输入:1 2 3 4
输出:4321
答案 3 :(得分:0)
作为其他答案的补充,我将发布此版本的aux
变量免费版本,该版本仅适用于整数。
为了交换两个整数,不需要任何其他辅助变量。
for (int i=0; i<dim/2; i++)
{
v[i] = v[i] ^ v[dim - i - 1];
v[dim - i - 1] = v[i] ^ v[dim - i - 1];
v[i] = v[i] ^ v[dim - i - 1];
}