나는 사용자가 입력과 함께 매트릭스의 크기를 알려주는 동적 2 차원 행렬을 만들려고 노력하고있다. 예 : 3 1 2 3 4 5 6 7 8 9, 여기서 첫 번째 int 3은 행렬의 크기 (3 * 3)이고 나머지 숫자는 행렬에 입력하려는 숫자입니다. 아이디어가 있나요?입력과 함께 한 줄로 배열의 크기를 얻는 것
답변
귀하가 찾고 계신 것입니다. 코드는 코드의 주석에 설명되어 있습니다.
here을 읽고 c
에 동적 2d 배열을 만드는 방법.
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf("%d", &n);
/* It will allocate an array of pointers with n elements*/
int **arr = (int**)malloc(n*sizeof(int*));
/* each element in the above array would contain another array that makes the upper array as the 2D array */
for (int i = 0; i < n; i++)
arr[i] = (int*)malloc(n * sizeof(int));
/*It is taking the input to put inside the array */
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
scanf("%d", &arr[i][j]);
/* This is printing the content inside the array */
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
printf("%d\t", arr[i][j]);
return 0;
}
"동적"바로 2D 매트릭스의 크기가 런타임에 정의되어 있음을 의미한다면, 당신은 가변 길이 배열을 사용할 수 있습니다. 이들은 함수 범위에서 생성되며 n x n
연속적으로 저장된 정수가 array[x][y]
과 같이 액세스 할 수 있다는 점에서 "실제"2D 배열입니다. 이 방법을 설명하기에 다음 코드를 참조하십시오 :
int main() {
int n;
if (scanf("%d", &n) != 1 || n <= 0) {
printf("invalid input.");
return 1;
}
int array[n][n]; // variable length array
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (scanf("%d", &array[i][j]) != 1) {
printf("invalid input.");
return 1;
}
}
}
// matrix is available in main...
return 0;
}
"동적"이라 함은, 그러나, malloc
를 사용하여 동적으로 할당 된 경우에, 당신은 모두 "진짜"2 차원 배열을 선도하지,이 기회가 :
첫째, (동적으로) 포인터 배열을 생성합니다. 각 항목은 (동적으로) 할당 된 int 배열을 가리 킵니다. 이점 : arr[x][y]
처럼 액세스 할 수 있습니다. 단점 : 행은 대등하게 저장되지 않지만 메모리에 확산됩니다 (아마).
두 번째로 (동적으로) 크기가 int 인 배열 n * n
을 만듭니다. 장점 : 값은 메모리의 동시 블록에 저장됩니다. 단점 : arr[x][y]
처럼 액세스 할 수 없으며 직접 셀 위치를 계산해야합니다 (예 : arr[y * n + x]
).
라인'int array [n] [n]; // variable length array'는 Visual Studio 2017 커뮤니티 에디션에서 에러를 발생시킵니다. ** 표현식이 상수로 평가되지 않았습니다 **. 그것은 배열 선언이 상수이기를 기대하고 변수를 제공하기 때문일 수 있습니다. – Siraj
https : // stackoverflow.com/a/19920531/5132337 동적 인 2 차원 배열 – Siraj
@Siraj의 생성을 더 잘 설명합니다. 사용 된 컴파일러가 C99 또는 C11의 선택적 기능을 지원하지 않기 때문에 "표현식이 상수로 평가되지 않았습니다"라는 오류 메시지가 표시됩니다. (컴파일러는 C++ 또는 C 컴파일러를 사용 했습니까?) – chux
확실하게 명령 줄 인수를 사용하거나 프로그램 시작 후 사용자 입력을 허용 할 수 있습니다. 하지만 "2d"를 원한다면 사용자가 너비와 높이를 입력해야하지 않을까요? 일부 시스템에서는 명령 줄 인수의 수를 제한 할 것이라고 생각하지만 (누군가는 알 수 있습니다) 프로그램 시작 후 사용자 입력을 읽고 자신을 구문 분석하는 것이 좋습니다. – yano
'malloc'에 관해 읽는 것 –
나의 나쁜. 문제가 해결되었습니다. 나는 그 숫자의 나머지 부분이 입력 인 n * n 행렬을 줄 3을 얻는 것을 의미한다. – Nadia