用户从一行输入到多维数组

时间:2017-11-20 09:16:55

标签: c

所以我有这个例子:

  

3 4 6 11 4 6 38 7 6 9

我需要从用户那里获得多个数字并创建多维array

第一个号码N(我的示例中为3)表示我的array(或matrix)将包含值并插入所有这些数字(接下来的9个值)到我的array

首先我需要根据我的第一个值(在我的示例中为3)定义数组并创建我的数组:

int a[3][3];

这里的问题是我需要在一行中获取所有输入,所以我不能使用它:

int marks[3];
int i;

for(i=0;i<3;i++)
{
    printf("Enter a no\n");
    scanf("%d",(marks+i));
}

3 个答案:

答案 0 :(得分:0)

  

scanf从stdin中读取数据,并根据参数格式将它们存储到附加参数指向的位置。

scanf将存储来自stdin的整个输入,因此它是否在单行中并不重要。代码的方式就是,只需向用户询问尺寸并创建给定尺寸的变量,并用scanf填充每个值。

有三种方法可以做到:

  1. 如果您的编译器支持可变长度数组:

    int size,i,j;
    scanf("%d",&size);
    
    int matrix[size][size];
    
    for(i=0;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            scanf("%d",&matrix[i][j]);
        }
    }
    
  2. 不支持变长数组:(使用指针数组)

    int size,i,j;
    scanf("%d",&size);
    
    int **matrix;
    matrix = (int **)malloc(sizeof(int *) * size);
    
    for(i=0;i<size;i++)
    {
        matrix[i] = (int *)malloc(sizeof(int) * size);
    }
    
    for(i=0;i<size;i++)
    {
        for(j=0;j<size;j++)
        {
            scanf("%d",&matrix[i][j]);
        }
    }
    

    这看起来很简单,但方式非常差,因为它实际上不是2D数组而是指针数组。因此,如果您的编译器不支持可变长度数组,我建议使用第三种方法。

  3. 使用malloc :(带指针)

    创建整数数组,如:

    int size;
    scanf("%d",&size);
    int *matrix;
    matrix = (int *) malloc( sizeof(int) * size * size );
    

    现在,要填充或获取数组的值,您需要遍历特定值。

    填写:

     for(i=0;i<size;i++)
     {
        for(j=0;j<size;j++)
        {
            scanf("%d", (matrix + i*(size) + j));
        }
     }
    

    迭代:(在这种情况下打印)

     for(i=0;i<size;i++)
     {
        for(j=0;j<size;j++)
        {
            printf("%d " ,*(matrix+ i*size + j) );
        }
        printf("\n");
     }
    
  4. 注意:限制输入并检查它是否位于某个固定范围内非常重要。例如:(0 <大小<100)。这很简单,你可以自己做。我只回答了重要的部分:)

答案 1 :(得分:-1)

首先,您不能在3x3矩阵中存储10个数字。在开始编程之前,请务必确保您的规范有意义。

输入是微不足道的,只需使用嵌套循环来控制读取输入在矩阵中的最终位置。具有固定数组大小的示例:

#include <stdio.h>
#include <stdlib.h>

#define x 3
#define y 3

int main (void)
{
  int arr[x][y];

  printf("Enter %d numbers: ", x*y);

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      scanf(" %d", &arr[i][j]);
    }
  }

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }

  return 0;
}

(注意,这会在stdin中留下很多像换行字符一样的垃圾。还没有缓冲区溢出保护。有关如何正确读取输入的示例,请参阅How to read / parse input in C? The FAQ。)

如果需要可变大小矩阵,可以使用可变长度数组(VLA):

size_t x = 3; // some run-time value
size_t y = 3; // some run-time value
int arr[x][y];
... // then same code as above

或者,您可以使用动态分配的2D数组:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  size_t x = 3;
  size_t y = 3;
  int (*arr)[y] = malloc( sizeof(int[x][y]) );

  printf("Enter %zu numbers: ", x*y);

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      scanf(" %d", &arr[i][j]);
    }
  }

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      printf("%d ", arr[i][j]);
    }
    printf("\n");
  }

  free(arr);

  return 0;
}

或者,如果您的编译器来自侏罗纪时期,您可以使用旧式“受损”2D阵列:

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
  size_t x = 3;
  size_t y = 3;
  int* mangled = malloc(x * y * sizeof *mangled);

  printf("Enter %zu numbers: ", x*y);

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      scanf(" %d", &mangled[i*x + j]);
    }
  }

  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      printf("%d ", mangled[i*x + j]);
    }
    printf("\n");
  }

  free(mangled);

  return 0;
}

以上4种替代方案是唯一的替代方案。你不应该使用“指向指针查找表”,这里绝对不需要它们。不幸的是,很多坏书和坏老师都在传播这种技巧。请参阅Correctly allocating multi-dimensional arrays

答案 2 :(得分:-3)

试试这个:

int** InitMatrix()
{
    int** matrix = NULL;

    int n;
    if (scanf("%d", &n) > 0 && n > 0)
    {
        matrix = malloc(n * sizeof(int*));
        for (int i = 0; i < n; i++)
        {
            matrix[i] = malloc(n * sizeof(int));
            for (int j = 0; j < n; j++)
            {
                if (scanf("%d", &matrix[i][j]) == 0)
                {
                    // user input error; decide what to do here
                }
            }
        }
    }
    else
    {
        // user input error; decide what to do here
    }

    return matrix;
}