Я пытался создать квадратную матрицу NxN (размер квадратной матрицы определяется пользователем), но, похоже, столкнулся с проблемой. Отображаемая матрица на самом деле является симметричной матрицей, что я не пытаюсь сделать, поскольку я хочу, чтобы каждое значение содержало уникальное целое число. Любая помощь приветствуется. Вот мой код:
#include <stdio.h>
int main()
{
int i;
int j;
int size = 1;
int array [size][size];
printf ("Enter the size you would like for the nxn matrix: ");
scanf ("%d", &size);
printf ("Now enter elements into the matrix. \n");
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
printf ("[%d][%d] = ", i, j);
scanf ("%d", &array [i][j]);
}
}
printf ("------------------------\n\n");
printf ("the matrix is: \n\n");
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
printf (" %d ", array [i][j]);
}
printf ("\n");
}
return (0);
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
// Create variables
int i, j, size;
// Create 2D array
printf ("Enter the size you would like for the nxn matrix: ");
scanf ("%d", &size);
int *array = (int *)malloc(size * size * sizeof(int));
// Fill 2D array with values
printf ("Now enter elements into the matrix. \n");
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
printf ("[%d][%d] = ", i, j);
scanf ("%d", &array[i * size + j]);
}
}
printf ("------------------------\n\n");
// Display values of 2D array
printf ("the matrix is: \n\n");
for (i = 0; i < size; i++)
{
for (j = 0; j < size; j++)
{
printf ("%d", array[i * size + j]);
}
printf ("\n");
}
free(array);
return (0);
}
scanf()
по размеру работает, и что число, указанное пользователем, является правдоподобным (строго положительным и не слишком большим - возможно, до 1024). Поскольку вы используете malloc()
, вам не нужно беспокоиться о переполнении стека, тогда как с VLA вам нужно беспокоиться об этом. Вы должны проверить, что scanf()
в цикле работают правильно; вам не нужно проверять числа. При печати матрицы необходимо ставить пробел между числами в каждой строке. (Мое личное bête noire: вам не нужен пробел перед печатными символами новой строки.)
for (int i = 0; i < size; i++)
для элементов управления циклом. Тогда вам не нужно объявлять i
(или j
) в верхней части функции.
int array [size][size];
это массив фиксированного размера. Он не меняет размер только потому, что вы позже измените значение переменнойsize
Либо переместите эту строку, чтобы она находилась послеscanf
либо, что еще лучше, используйте динамическое размещение. kaylumarray
послеsize
, то вы можете отлично использовать нотациюarray[i][j]
Если вы хотите использоватьmalloc()
чтобы избежать переполнения стека, вы можете написатьint (*array)[size] = malloc(size * size * sizeof(array[0][0]));
(и убедитесь, что это было успешно) и по-прежнему используйте нотациюarray[i][j]
Это указатель на VLA. Jonathan Leffler