无法打印以相反顺序输入数组的数字

Unable to print numbers entered into an array in reverse order

我正在尝试编写一个包含数组的程序,其中:

下面的代码是我最大的努力(我第 5 次尝试解决问题),但它收集整数零并将其显示在数组索引中(我试图附加其他五个,但它一直在产生错误):

int main()
{
   #define ARRAY_LENGTH 10

   int numbers[ARRAY_LENGTH];
   int numbersEntered = 0;

   for (int i = 0; i < ARRAY_LENGTH; i++)
   {
       numbers[i] = 0;
   }

   int number = 0;
   printf("Enter an integer; 0 to quit: ", ARRAY_LENGTH - 1);
   scanf_s("%d", &number);

   while (number != 0 && numbersEntered < ARRAY_LENGTH - 1)
   {
       numbersEntered++; 
       numbers[numbersEntered] = number;
       printf("Enter another integer; 0 to quit: ", ARRAY_LENGTH - 1);
       scanf_s("%d", &number);
   }

   for (int i = numbersEntered; i >= 0; i--)
   {
       printf("index %d -> %d\n", i, numbers[i]);
   }
}

看到问题是首先你在这里用零初始化整个数组

for (int i = 0; i < ARRAY_LENGTH; i++)
   {
   numbers[i] = 0;
   }  

那你就是这样做的

while (number != 0 && numbersEntered < ARRAY_LENGTH - 1)
   {
   numbersEntered++; 
   numbers[numbersEntered] = number;
   printf("Enter another integer; 0 to quit: ", ARRAY_LENGTH - 1);
   scanf_s("%d", &number);
   } 

所以发生的事情是,因为 numbersEntered 已经初始化为零,所以你将它递增 1,所以第一个数字输入数组 numbers 为 0,因为您在开始时初始化了整个数组本身。

所以一个快速的修复方法就是将它向下移动一行并将 while 循环代码更改为此

while (number != 0 && numbersEntered < ARRAY_LENGTH - 1)
   {
   numbers[numbersEntered] = number;
   numbersEntered++; 
   printf("Enter another integer; 0 to quit: ", ARRAY_LENGTH - 1);
   scanf_s("%d", &number);
   }

同样正如 Kiran 在评论中指出的那样,循环打印需要更改为

for (int i = numbersEntered-1; i > 0; i--)
   {
   printf("index %d -> %d\n", i, numbers[i]);
   }

我认为这是因为您没有将任何数字插入到数组的第一个位置 (place[0]),因为您过早地提示了 numbersEntered 的值。尝试以这种方式编写循环:

while (number != 0 && numbersEntered < ARRAY_LENGTH - 1){
   numbers[numbersEntered] = number;
   printf("Enter another integer; 0 to quit: ", ARRAY_LENGTH - 1);
   scanf_s("%d", &number);
   numbersEntered++; 
}
  1. printf("Enter an integer; 0 to quit: ", ARRAY_LENGTH - 1);应该是 printf("Enter an integer; 0 to quit: ");
  2. 你应该使用 scanf 而不是 scanf_s

以下 code 可以工作:

#include <stdio.h>

#define ARRAY_LENGTH 10

int main()
{
    int numbers[ARRAY_LENGTH];
    int i;
    int k;

    for (k = 0; k != ARRAY_LENGTH; ++k)
    {
        printf("Enter an integer; 0 to quit: ");
        if (scanf("%d", numbers + k) != 1 || numbers[k] == 0)
            break;
    }

    for (i = k - 1; i >= 0; --i)
        printf("index %d -> %d\n", i, numbers[i]);
    return 0; 
}

这是我的一个解决方案,其中包含一些好的做法,这是对您的代码的调整:

1) 您可能希望在函数(或 main)之外定义,这样您就可以在整个程序中使用相同的常量;

2) 任何具有 return 类型的函数(例如 int main)必须在末尾 return 某些东西,因此您必须在 main 末尾有一个 "return 0"函数;

3) do-while 部分将确保您的代码在检查 while 条件之前执行一次;

4) numbers[numbersEntered++] = number; 会将 "number" 的值赋给 "numbers[numbersEntered]",然后将 "numbersEntered" 加一;这是为了减少您必须编写的代码量:);

希望对您有所帮助,如果您有更多问题,希望我能回答:)。

#define ARRAY_LENGTH 10

int main()
{

    int numbers[ARRAY_LENGTH];
    int numbersEntered = 0;

    for (int i = 0; i < ARRAY_LENGTH; i++)
        numbers[i] = 0;

    int number = 0;

    do
    {

        printf("Enter an integer; 0 to quit: ");
        scanf_s("%d", &number);

        if (number == 0)
            break;

        numbers[numbersEntered++] = number;


    } while (number != 0 && numbersEntered < ARRAY_LENGTH);

    if (numbersEntered > 0)
    {

        for (int i = numbersEntered - 1; i >= 0; i--)
            printf("index %d -> %d\n", i, numbers[i]);

    }

    return 0;

}