C语言 我想打印一个数组的反向,但它不是打印数组的所有元素


 #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]);
}
}

谢谢大家的帮助,但现在可能是错误显示垃圾值。

对于定义的数组

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

由于arr[0]包含1,您的代码将只打印arr[3], arr[2]和arr[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中size为4的int)你可以把它除以数组中的任何一个元素那么你的迭代器变量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;
}

最新更新