You are on page 1of 3

1-1. 1행의 `#include`는 C 프로그래밍에서 전처리기 지시문을 의미한다.

#include는 헤더파
일을 포함시키는 기능을 가지고 있는데, 헤더파일을 포함시키도록 컴파일러에 지시한다. 여기
서 헤더파일은 .h라는 확장자를 가지는 라이브러리를 의미한다.

1-2 stdio.h는 표준 입출력 라이브러리를 포함시키는 헤더파일이다. ‘printf’나 ‘scanf’와 같


은 함수는 stdio.h를 통해 사용이 가능하다. 만일 <stdio.h> 라는 헤더파일을 포함시켜 구동
시키지 않는다면 컴파일러가 printf나 scanf같은 함수를 읽을 수 없기 때문에 컴파일 오류가
발생한다.

1-3. void는 함수의 구동 이후에 출력되는 값의 타입이 존재하지 않다는 의미이다. 다시 말


해, 함수가 어떤 값도 반환하지 않는다는 것을 의미한다. Print 함수의 block 내에서 지정된
작업을 수행하지만, 어떠한 값도 return하지 않는다. 따라서 return;이 생략 가능한 것이다.

1-4. arr이라는 array 함수의 이름만 언급한다면 array 함수의 0번째를 가리키는 pointer로
취급된다. 따라서 (int* source)와 같이 포인터로 선언된 함수도 이용될 수 있다. 즉, 배열이
함수에 전달될 때, 배열의 첫 번째 요소가 함수에 전달되어 작동되기 때문에 포인터로 선언된
함수임에도 작동이 가능하다.

1-5. arr배열의 5~9번째는 루프에서 명시적으로 값이 설정되지 않았다. 다음과 같이 명시적


인 값이 설정되지 않았다면, 쓰레기 값이 그 배열에 남게 된다. 혹은 이전에 프로그램을 구동
시킨 이력이 있다면 이전의 값이 그대로 남아있게 된다.

1-6. *는 포인터의 메모리에 저장돼있는 값에 접근하는 것을 허용하는 연산자이다. 7행에서의


*는 printf("%d ", *(source + i)); 이기 때문에 source의 i번째에 저장돼있는 값에 접근하게
된다.

1-7. pointer arithmetic은 array 함수 + i꼴로 이루어져 있다. 이는 array 함수의 i번째 즉,
array[i]와 동일한 의미를 가진다. 첫 번째로, 7번 라인에서 *(source + i)와 같이 pointer
arithmetic을 사용하여 배열의 요소에 접근하였다. 이와 동일하게 14번 라인에서 arr+i라는
pointer arithmetic이 사용되었다.

1-8. pointer arithmetic에 의해 arr 배열의 0번째 요소에 scanf를 이용하여 정수값이 입력
된다. 이후 loop를 통해 i가 1, 2, 3, 4로 변경된다. 따라서 arr이 i칸 만큼 이동하여 다시
scanf에 의해 정수값이 입력된다. 이후 loop가 끝나면 Print 함수가 실행되면서 Print 함수의
작업이 수행된다. Print 함수는 arr배열의 0~4번째 요소가 차례대로 print되는 함수로써 이후
arr 배열의 0~4번째 요소가 출력될 것이다.

1-9. 동적 할당을 이용하면 문제를 해결하는 데 도움이 된다. 동적 할당된 배열은 크기의 유
연성과 메모리 관리의 효율성 면에서 일반적으로 더 유리합니다. 그 중, malloc 함수를 사용
하면 되는데, arr을 동적 할당을 통해 배열의 size를 결정할 수 있다. 이를 통해 유동적으로
array의 size나 elements를 설정하는 데 용이할 것이다.
2-1. %s는 문자열을 저장하는 연산자이다. 즉, 입력값에서 공백을 만날때까지 문자를 한꺼번
에 저장하는 연산자이다. %c는 문자를 저장하는 연산자이다. 즉, 입력값에서 한 문자씩만을
저장한다. 또한, 공백을 생략하지 않는다는 차이점이 존재한다.

2-2. 문자의 길이를 구하기 위한 코드이다. loop가 작동되고, 사전에 정수 0으로 할당했던
cnt값을 ++를 통해 값을 증가시킨다. \0이 문자의 끝에 존재하기 때문에, null character를
만났을 때 break문을 사용하여 문자의 길이를 세는 것을 종료시킨다.

2-3. ‘\0’은 null character를 의미한다. 문자열에는 요소들이 할당 된 후, 마지막 끝자리에


‘\0’이 할당된다. 따라서 loop를 돌릴 때 끝에 null character가 존재하는지 비교를 통해 파
악한 후 문자의 길이를 비교했던 것이다.

2-4. 작은 따옴표 (‘)는 단일 문자를 나타내며 큰 따옴표 (“)는 문자열 자체를 나타내는데 사
용된다. \0은 위에서 말했듯, null character이다. 이는 하나의 단일 문자를 의미하기 때문에
작은 따옴표를 사용하여 코드를 짜는 것이 옳은 방법이다.

2-5. ++cnt는 cnt값을 먼저 이용한 후에 값을 1 올리며, cnt++은 cnt의 값을 먼저 1 올린


뒤 cnt값을 이용한다. 위의 코드는 cnt의 값을 모두 사용한 뒤에 cnt값을 올리기 때문에
cnt++과 ++cnt간에는 차이가 없을 것이다.

2-6. 배열은 첫 번째 요소를 0번째, 두 번째 요소를 1번째.. 와 같이 취급한다. 따라서 만약


cnt값으로 initialize하게 된다면 null character가 읽힐 것이다. 우리의 목표는 문자열만을
고려하는 것이기 때문에 cnt가 아닌 cnt-1부터 initialize를 진행함으로써 문자열부터 읽도록
한다.

3-1. 위 코드의 함수는 3가지로 나뉜다.


swap_ptr 함수는 두 포인터가 가리키는 값을 서로 교환하는 함수이다. *a의 값과 *b의 값을
temp 변수를 이용하여 맞바꾸는 코드를 수행한다.
reverse 함수는 배열의 요소들을 뒤집는 함수이다. 배열을 반으로 나눠서 각 요소와 대칭되는
위치의 요소를 swap_ptr을 통해 교환한다. 예를 들어, 첫 번째 요소는 10번째 요소와 대칭이
므로 서로 값이 교환된다.
main 함수는 num이라는 배열을 설정하며, 각 요소들을 결정한다. 이후 for 반복문을 통해
num의 요소들을 print하고, 이후 \n을 print한다. 이후, num 배열과 size 10을 이용하여
reverse 함수를 실행시킨다. 그 이후에 for 반복문을 한번 더 이용하여 num의 요소들을
print한다. 이후 \n을 print하여 코드를 마무리한다.

3-2. pointer를 사용하지 않고 함수 내에서 값을 swap 했을 경우, 그 함수를 벗어났을 때,


실제로 값이 swap 되지 않는다. 이는 swap 함수가 값의 복사본을 사용하였으며, 원본에 대해
서는 실제로 swap을 하지 않았기 때문이다. pointer를 사용하면 메모리 주소에 있는 실제 데
이터를 조작할 수 있게 하기 때문에 pointer를 사용한 것이다.
3-3. &가 의미하는 것은 포인터가 가리키는 메모리 주소를 의미한다. 그렇기 때문에 &를 사
용한 것이며, &가 없이 사용하고 싶다면 array의 이름만 작성하면 된다. 위에서 설명했듯,
array의 이름만 작성하면 array의 첫 번째 요소를 가리키는 포인터로 이용될 수 있기 때문이
다.

3-4. 문제가 없다. 10개 중 9개가 채워지게 되면, 나머지 채워지지 않은 부분에는 자동적으로
0이 채워진다. 따라서 num은 1,2,3,4,5,6,7,8,9,0의 값이 요소로 할당될 것이다.

3-5. 한 번 바뀐 요소들이 또 한번 바뀌어 원래의 배열과 다를 바가 없어진다. 즉, 전체적으


로 배열이 한 번 더 뒤바뀌어 결국 처음의 값과 동일한 값이 출력될 것이다. 현재 배열은 짝
수 개의 요소를 가진 배열이므로 이에 맞춰 코드가 씌여졌다. 만일, 배열이 홀수 개의 요소를
가진다면 요소의 중앙에 있는 값을 swap하려고 시도할 것이다. 다만, 중앙에 있는 값을 swap
한다 해도 기존의 목적은 이룰 수 있을 것이다.

4-1. string.h는 문자열 처리와 관련된 함수를 제공하는 헤더 파일이다. 이 코드에서는


CountSpaces 함수의 strlen 함수가 string.h에 포함되어 있기 때문에 여타 다른 코드와 달
리 string.h 헤더 파일이 필요했던 것이다.

4-2. fgets 함수를 통해 사용자가 입력한 만큼의 요소만이 str에 입력될 것이다.
CountSpaces 함수 내에서 strlen 함수를 통해 배열의 문자 길이를 파악하여 count를 올리
도록 설정해놓았기 때문에 배열의 유연성과 편의성을 위하여 일부러 함수 배열의 길이를 설정
해놓지 않은 것이다.

4-3. 공백을 셈으로써 단어의 개수를 파악하려고 하기 때문에 오류가 일어날 것이다. 예를 들
어, “Hello World” 와 같은 문장은 프로그램에서 5개의 공백이 존재하기 때문에 6의 값
이 출력되지만 실제 단어 수는 2개이므로 오류가 발생하는 것을 확인할 수 있다.

4-4. fgets 함수는 띄어쓰기가 포함된 문장 즉, 공백이 포함된 문자열들을 저장할 수 있다.
하지만 scanf는 띄어쓰기가 포함된 문장을 입력하면 띄어쓰기가 시작되기 이전 즉, 공백이 나
타나기 전의 문자열만이 저장된다. 위 코드는 공백을 세야하는 프로그램이기 때문에 scanf 대
신 fgets를 선택한 것이다.

논의한 학생 (1명)
2023312043 김솔규

You might also like