反向打印整数数组

时间:2015-03-17 04:50:16

标签: c arrays

以相反的顺序打印整数数组这是一个相当简单的问题。虽然每当我尝试打印时,它最终都会显示垃圾值。以下是我的计划。

#include <stdio.h>
#include <conio.h>
int main()
{
    int temp = { '\0' };
    int num[9];
    int i;
    int j = 8;

    printf("Enter 8 numbers\n");
    for (i = 0; i < 8; i++)
    {
        scanf_s("%d", &num[i], 1);
    }
    for (i = 0; i <= j; i++, j--)
    {
        temp = num[i];
        num[i] = num[j];
        num[j] = temp;  
    }
    printf("\nThe numbers in reverse are\n");
    for (i = 0; i <=8; i++)
    {
        printf("%d\n", num[i]);
    }
    _getch(); 
    return 0;
}

假设我输入的数字从1到8,它会反向打印数字,但它打印的第一个值是垃圾值。我知道我可以使用和If语句来对抗这种情况,但有没有办法在不使用if的情况下解决这个问题?

4 个答案:

答案 0 :(得分:6)

你在这里犯了两个错误:

  • 使用8个数字,最高项目的索引是7,而不是8.在初始化时将j设置为7以解决此问题。
  • 当您从索引零处迭代8个数字时,请使用运算符<!=,而不是<=以避免出现一个错误。你的第一个循环正确,但最后一个循环被破坏了。

此外,您可能希望将数组的大小减小到8,因为第9个元素未使用。

答案 1 :(得分:4)

如果要反向打印数组中的整数,只需从最后一个索引处开始,然后再进行操作。

第三个循环应该更像这样:

int j = 7; // an array of size 8 starts at the 0th and ends at the 7th index.
while(j >= 0)
{
   printf("%d", num[j]);
   j--;
}

答案 2 :(得分:2)

您的计划中存在多种逻辑不一致,

您将数组定义为包含9个元素

int num[9];

但只输入8个元素

for (i = 0; i < 8; i++)
{
    scanf_s("%d", &num[i], 1);
}

因此,未初始化具有insex 8的数组的最后一个元素。然而,在交换数组元素的循环中,您可以访问此未初始化元素

int j = 8;
//...
for (i = 0; i <= j; i++, j--)
{
    temp = num[i];
    num[i] = num[j];
    num[j] = temp;  
}

也无需使用函数scanf_s代替scanf

考虑到以相反的顺序输出数组,你不需要交换它的元素。

以相反顺序输出数组而不交换其元素的程序可以采用以下方式

#include <stdio.h>
#include <conio.h>

#define N   9

int main( void )
{
    int num[N];
    int i;

    printf( "Enter %d numbers\n", N );

    i = 0;
    while ( i < N && scanf( "%d", &num[i] ) == 1 ) i++;

    printf( "\nThe numbers in reverse are\n" );

    while ( i-- ) printf( "%d ", num[i] );
    printf( "\n" );

    _getch(); 

    return 0;
}

如果要输入数字序列

1 2 3 4 5 6 7 8 9

然后输出看起来像

9 8 7 6 5 4 3 2 1 

如果要交换数组的元素,那么程序可能看起来像

#include <stdio.h>
#include <conio.h>

#define N   9

int main( void )
{
    int num[N];
    int n;
    int i;

    printf( "Enter %d numbers\n", N );

    n = 0;
    while ( n < N && scanf( "%d", &num[n] ) == 1 ) n++;

    for ( i = 0; i < n / 2; i++ )
    {
        int tmp = num[i];
        num[i] = num[n - i - 1];
        num[n - i - 1] = tmp;
    }

    printf( "\nThe numbers in reverse are\n" );

    for ( i = 0; i < n; i++ ) printf( "%d ", num[i] );
    printf( "\n" );

    _getch(); 

    return 0;
}

如果输入与上面相同,那么输出将是

9 8 7 6 5 4 3 2 1 

答案 3 :(得分:2)

您还可以使for循环保持不变并更改索引

    #define ARRAY_SIZE 8

    // print in reverse order
    for (i = 0; i < ARRAY_SIZE; i++)
    {
        printf("%d\n", num[ARRAY_SIZE - i - 1]);
    }

当您需要不同的数组大小时,我使用了#define来更轻松地更改程序:只需在一个地方而不是当前需要的地方进行更改。