我想反向打印一个数组,但它没有打印数组的所有元素
I want Print an array in reverse but it is not printing all the elements of the array
#include <stdio.h>
int main()
{
int a,n,i;
int arr[n];
// int arr[]={1,4,3,2};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=n;i>=0;i--)
{
printf("%d ",arr[i]);
}
}
感谢大家的帮助,但现在它显示垃圾值可能是什么错误。
由于 arr[0] 包含 1,您的代码将只打印 arr[3]、arr[2] 和 arr[1]。
对于定义的数组
int arr[]={1,4,3,2};
在这个for循环中
for(int i=3;i>=arr[0];i--)
i
等于0不大于等于arr[0]
等于1
。因此,当 i
等于 0
.
时,循环条件 i>=arr[0]
的计算结果为逻辑假
也许你实际上是指下面的循环
for(int i=3;i >=0;i--)
注意使用像3
这样的幻数不是个好主意。
您可以按以下方式定义循环
for ( size_t i = sizeof( arr ) / sizeof( *arr ); i != 0; --i )
{
printf( "%d ", arr[i - 1] );
}
或
for ( size_t i = sizeof( arr ) / sizeof( *arr ); i != 0; )
{
printf( "%d ", arr[--i] );
}
另外,您评论中的语句顺序错误
int a,n;
//int arr[n];
//scanf("%d",&n);
首先你需要在变量 n
中读取一个正值,然后才声明可变长度数组 arr
int a,n;
scanf("%d",&n);
int arr[n];
这是一个演示程序。
#include <stdio.h>
int main(void)
{
size_t n;
if ( scanf( "%zu", &n ) == 1 && n != 0 )
{
int arr[n];
for ( size_t i = 0; i < n; i++ )
{
scanf( "%d", arr + i );
}
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", arr[i] );
}
putchar( '\n' );
for ( size_t i = n; i != 0; i-- )
{
printf( "%d ", arr[i-1] );
}
putchar( '\n' );
}
return 0;
}
如果输入以下值
5
1 2 3 4 5
那么程序输出将是
1 2 3 4 5
5 4 3 2 1
您可以这样做:
int main ()
{
int a, n;
//int arr[n];
int arr[] = { 1, 4, 3, 2 };
//scanf("%d",&n);
for (int i = sizeof (arr) / sizeof (arr[0]) - 1; i >= 0; i--)
{
printf ("%d ", arr[i]);
}
}
sizeof 给出类型的大小(对于 c 中的 int 大小是 4)
所以你可以将它除以数组的任何一个元素
那么你的迭代器变量 i 的值也是动态的。
打印反向数组时需要将 for 循环中的条件调整为 i = n -1
。
您正在获取垃圾值,因为您的第二个 for 循环试图打印超出范围的 arr[n]。数组索引从 0 到 n-1,其中 n 是数组的大小。 Ref
这是更正后的代码。
#include <stdio.h>
int main()
{
int a,n,i;
int arr[n];
// int arr[]={1,4,3,2};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=n;i>0;i--)
{
printf("%d ",arr[i-1]);
}
return 0;
}
#include <stdio.h>
int main()
{
int a,n,i;
int arr[n];
// int arr[]={1,4,3,2};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=n;i>=0;i--)
{
printf("%d ",arr[i]);
}
}
感谢大家的帮助,但现在它显示垃圾值可能是什么错误。
由于 arr[0] 包含 1,您的代码将只打印 arr[3]、arr[2] 和 arr[1]。
对于定义的数组
int arr[]={1,4,3,2};
在这个for循环中
for(int i=3;i>=arr[0];i--)
i
等于0不大于等于arr[0]
等于1
。因此,当 i
等于 0
.
i>=arr[0]
的计算结果为逻辑假
也许你实际上是指下面的循环
for(int i=3;i >=0;i--)
注意使用像3
这样的幻数不是个好主意。
您可以按以下方式定义循环
for ( size_t i = sizeof( arr ) / sizeof( *arr ); i != 0; --i )
{
printf( "%d ", arr[i - 1] );
}
或
for ( size_t i = sizeof( arr ) / sizeof( *arr ); i != 0; )
{
printf( "%d ", arr[--i] );
}
另外,您评论中的语句顺序错误
int a,n;
//int arr[n];
//scanf("%d",&n);
首先你需要在变量 n
中读取一个正值,然后才声明可变长度数组 arr
int a,n;
scanf("%d",&n);
int arr[n];
这是一个演示程序。
#include <stdio.h>
int main(void)
{
size_t n;
if ( scanf( "%zu", &n ) == 1 && n != 0 )
{
int arr[n];
for ( size_t i = 0; i < n; i++ )
{
scanf( "%d", arr + i );
}
for ( size_t i = 0; i < n; i++ )
{
printf( "%d ", arr[i] );
}
putchar( '\n' );
for ( size_t i = n; i != 0; i-- )
{
printf( "%d ", arr[i-1] );
}
putchar( '\n' );
}
return 0;
}
如果输入以下值
5
1 2 3 4 5
那么程序输出将是
1 2 3 4 5
5 4 3 2 1
您可以这样做:
int main ()
{
int a, n;
//int arr[n];
int arr[] = { 1, 4, 3, 2 };
//scanf("%d",&n);
for (int i = sizeof (arr) / sizeof (arr[0]) - 1; i >= 0; i--)
{
printf ("%d ", arr[i]);
}
}
sizeof 给出类型的大小(对于 c 中的 int 大小是 4) 所以你可以将它除以数组的任何一个元素 那么你的迭代器变量 i 的值也是动态的。
打印反向数组时需要将 for 循环中的条件调整为 i = n -1
。
您正在获取垃圾值,因为您的第二个 for 循环试图打印超出范围的 arr[n]。数组索引从 0 到 n-1,其中 n 是数组的大小。 Ref
这是更正后的代码。
#include <stdio.h>
int main()
{
int a,n,i;
int arr[n];
// int arr[]={1,4,3,2};
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(int i=n;i>0;i--)
{
printf("%d ",arr[i-1]);
}
return 0;
}