scanf 함수를 사용해서 문자열을 배열에 넣으려면 결국 문자열을 다루는 법을 알아야 할텐데, 앞의 강의에는 char 자료형 강의은 있지만 '문자열' 강의는 없어 의문이 들어 질문드립니다.
정말 앞의 강의 내용만으로 이 문제를 처리할 수 있나요?
어떤 부분을 봐야 문자열을 배열에 넣는 방법을 알 수 있을까요?
이전 독자가 문의한 코드에서 입력 부분을 참고하세요.
https://glot.io/snippets/f9gs0kmwms
문자열 입력을 설명하지 않았기 때문에 해당 부분을 문제에서 보면 코드를 미리 제시했습니다.
문제의 제시문을 보면
----
여러 줄을 입력 받으려면 다음과 같이 for 반복문으로 scanf를 반복 호출하면 됩니다.
for (int i = 0; i < m; i++) { scanf("%s", matrix[i]); }
행렬의 가로 공간에는 문자열이 들어갑니다. 따라서 메모리를 할당할 때는 n + 1(가로 크기 + 1)만큼 할당하여 NULL이 들어갈 공간까지 확보해야 합니다. 이 부분은 'Unit 39 문자열 사용하기'(515쪽), 'Unit 40 입력 값을 문자열에 저장하기'(527쪽)에서 자세히 설명하겠습니다.
----
포인터로 2차원 배열을 할당하고 2차원 배열처럼 사용하는 법은 Unit 38.3 포인터에 할당된 메모리를 2차원 배열처럼 사용하기에서 설명되어 있습니다. Unit 38.3에서는 포인터로 2차원 배열을 할당하고, 값을 코드에서 직접 넣었을 뿐입니다.
해당 부분은 코드를 미리 제시했고, 필요한 경우 뒤에 이어지는 Unit 39, 40을 참고할 수 있습니다. 그러나 기본은 제시된 코드 외에는 지금까지 배운 내용으로 풀 수 있게 되어 있습니다.
이 문제는 코딩 면접에서 자주 출제되고, 알고리즘 심사 대회에서도 기초 문제로 자주 출제되는데, 알고리즘은 어렵지 않고, 2차원 배열 제대로 다룰 수 있는지를 묻는 문제이기 때문입니다. 즉, 프로그래밍의 기초를 제대로 할 수 있는지 묻는 문제입니다.
문자열을 배열에 입력하는 방법은 문제에 제시되어 있습니다.
scanf("%s", matrix[i]);
matrix는 2차원 배열이고, 가로 행 전체는 한 번에 입력받습니다.
int일 때는 널 문자가 필요없지만, char 배열일 때는 문자열의 끝을 나타내는 널 문자가 필요하므로 1바이트를 더 할당해야 합니다. 역시 문제에 n + 1(가로크기 + 1)을 할당해야 한다고 제시되어 있습니다.
또한, 문제의 제시문으로 충분하지 않을 경우에는 심사 문제 심사 이후에 표시되는 해설에 구체적인 코드에 대한 해설이 제시됩니다.
scanf로 변수 두 개에 행렬의 크기 m과 n을 저장합니다(이하 변수는 m, n). 그다음에 m, n을 이용하여 2차원 배열을 만들려면 이중 포인터에 메모리를 할당해야 합니다. 따라서 char **matrix = malloc(sizeof(char *) * m);와 같이 세로 공간(행)에 해당하는 메모리를 할당합니다.(생략)
이후에도 더 많은 설명이 있습니다.
입력 부분을 설명하지 않았으므로 코드를 먼저 제시했고, 해설을 함께 제시했습니다.
포럼 우측 상단에 38.8로 검색하면 이전 Q&A를 볼 수 있습니다.
참고하세요.
중간고사 같은 문제이니 어려우면 나중에 풀어도 됩니다. 꼭 지금 풀어야 하는 건 아니니까요.