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

时间:2018-11-10 12:01:07

标签: c arrays while-loop reverse

我正在尝试使用以下数组编写程序:

  • 用户输入10个整数,然后以相反的顺序显示整数,或者
  • 用户最多输入10个整数,并使用0退出while循环,然后以相反的顺序显示输入的整数。

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

enter image description here

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

4 个答案:

答案 0 :(得分:1)

看到问题是,首先要在此处用零初始化整个数组

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

答案 1 :(得分:0)

我认为是因为您没有将任何数字插入数组的第一位(位置[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++; 
}

答案 2 :(得分:0)

  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; 
}

答案 3 :(得分:0)

这是我的解决方案,其中包含一些良好的实践,这是您对代码的调整:

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

2)任何具有返回类型(例如int main)的函数都必须在末尾返回某些内容,因此您必须在主函数的末尾具有“ return 0”;

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

4)userId将为“ numbers [numbersEntered]”分配“ number”的值,然后将“ numbersEntered”增加1;这是为了减少您必须编写的代码量:);

希望这对您有所帮助,如果您还有其他问题,希望我可以回答:)。

function DisplayUser({userId}) {
  const [loggedUser, setLoggedUser] = React.useState(null);
  React.useEffect(() => {
    fetchData(userId).then(user => {
      setLoggedUser(user);
    })
  }, [userId]); // only run when userId changed
  return (
    <div>
      <div>{loggedUser}</div>
    </div>
  );
}