在C中创建一个从1到n的连续数字数组?

时间:2017-08-09 13:19:57

标签: c arrays

我正在尝试编写一个函数,该函数将生成从1到数字n的连续数字数组。例如,我希望array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}。我的代码似乎没有运行,但我不知道为什么。

int count (int a)
{
   scanf("%d", &a);
   int i;
   int array[a];
   do
   {
      i = 0;
      a = a - i;
      array[a - 1] = a;
      i++;
   }
   while (a > 0);
   printf("Resulting array is %d", array[a]);
   return 0;
}

8 个答案:

答案 0 :(得分:3)

您应该使用for循环来创建数组。

int i;
int array[a];
for(i = 0; i < a; i++) {
  array[i] = i + 1;
}

return 0;

答案 1 :(得分:3)

惯用的C方式是定义一个填充现有数组的函数:

void count(int *array, int max)
{
    for (int i = 0; i < max; ++i)
    {
        array[i] = i+1;
    }
}

你可以打电话给他,例如像这样:

int arr[10];
count(arr, 10);
for (int i = 0; i < 10; ++i)
{
    printf("%d ", arr[i]);
}

答案 2 :(得分:2)

您的do while循环可以简单地替换为以下for循环:

for (i = 0; i < a; i++)
  array[i] = i + 1;

同样,要在array中显示每个元素,您可以通过array循环遍历for的元素:

for (i = 0; i < a; i++) 
  printf("Element at %2d is %d\n", i, array[i]);

答案 3 :(得分:1)

首先是打印声明

 printf("Resulting array is %d", array[a]);

错了!!那不是你打印阵列的方式。您需要遍历索引,获取单个元素并打印它们。

此外,当您尝试使用array[a]时,请考虑a的值。那肯定是不是你想要的。

也就是说,还存在其他问题,例如在i循环的每次迭代中将0设置为do...while。这将失去先前计算的值并重新开始。将初始赋值移到循环体外。

稍加修改的版本,请按照评论

#include  <stdio.h>

int count (void)                 // no need for parameter if you're asking user for size
{
   int size = 0;                 //define size
   int ret = scanf("%d", &size); //read it

   if ( (ret != 1) || ( size < 1) ) return -1;      //error check

   int i = 0;                    //initialize local variables

   int array[size];              //note: this is VLA

   do
   {
       array[i] = i+1;           //start populating elements
       i++;
   }
   while (size > i);             //go on unless you've reached the given size

   puts ("Resulting array is");   // start printing ....

   for (i = 0; i < size; i++)
   {
       printf("%d\t", array[i]);   //...them one by one
   }

   return 0;
}

int main(void)
{
    (void)count();  //call the function
}

答案 4 :(得分:0)

尝试这样的事情:

int* count(int a)
{
   int array[a];
   for (int i = 0; i < a; ++i)
   {
      array[i] = i + 1;
   }
   for (int i = 0; i < a; ++i)
   {
      printf("%d, ", i + 1);
   }
   return array;
}

答案 5 :(得分:0)

  • 您真的不需要a参数。您可以使用本地
  • 由于您在每次迭代时将do,while设置为i并且过于复杂,因此0已损坏。您可以通过更简单的方式获得相同的结果。位置i的元素必须具有值i+1,听起来很简单。
  • 您必须循环遍历数组的元素才能将它们全部打印出来。单个printf仅打印数组的1元素。如果你想要所有这些,那么你必须遍历所有这些。

如下所示:

void count(){
   int a,i=0;
   scanf("%d", &a);
   int array[a];
   while(i<a){
    array[i]=i+1;
    i++
   }

   //now print it
   i=0;
   while(i<a)
    printf(" %d ", array[i++]);

}

另外,请注意您使用的是VLA。这意味着你可以创建的数组大小有限,这取决于你的机器+编译器。

答案 6 :(得分:0)

所以这里有一些错误。一个,如果你接受&#39; a&#39;作为一个功能的arg,你为什么要扫描它。它只是写了你收集的价值。您尝试打印数组的方式有两个错误,如上所述,您应该使用循环。三,你可以保存几行,

for(int i =0; i<a ; i++) 
{ 
arr[i]=i+1;
 }

答案 7 :(得分:0)

  

我试图编写一个连续数组的函数   数字从1到数字n。

在C ++中,已经存在一个名为actual.every((x, i) => expect(x).toBeCloseTo(expected[i])); 的函数,并在标题iota中声明。

在C中,这样的功能可以按以下方式看待

<numeric>

这是一个示范程序

void iota(int a[], size_t n, int value)
{
    for (size_t i = 0; i < n; i++) a[i] = value++;
}

如果要输入#include <stdio.h> void iota(int a[], size_t n, int value) { for (size_t i = 0; i < n; i++) a[i] = value++; } int main(void) { size_t n = 1; scanf( "%zu", &n ); int a[n]; iota( a, n, 1 ); for ( size_t i =0; i < n; i++ ) printf( "%d ", a[i] ); putchar( '\n' ); return 0; } ,则输出将显示为

10

至于你的程序,然后在这个循环中

1 2 3 4 5 6 7 8 9 10

变量do { i = 0; a = a - i; array[a - 1] = a; i++; } while (a > 0); 未被更改,因为在每次迭代开始时变量a都设置为0.

您可以像

一样编写循环
i

考虑到这个陈述

i = 0;
do
{
    array[a - i - 1] = a - i;
    i++;
} while ( i != a );

没有意义。如果要按元素输出数组元素,则必须使用循环,例如它在上面的演示程序中显示。