개발 공부/C언어

독하게 시작하는 C 프로그래밍 - 챕터 3 연습문제

람쥐밍 2023. 3. 24. 11:31

챕터 3. 표준 입출력 도구 - 연습문제 풀이

 

1번)

#include <stdio.h>

int main (void) {

    char ch = 0;

    printf("입력 : ");
    getchar();
    ch = getchar();

    printf("출력 : %c", ch);

    return 0;
}

 

 

2번)

getchar()함수는 buffered input를 하는 반면, _getch()는 non buffered input을 하여 문자 하나를 입력 받는 함수다.

즉 _getch()는 사용자가 입력한 정보를 버퍼를 거치지 않고 바로 전달 받는다는 것이다. getchar()는 사용자가 입력한 정보 그 자체를 얻고자 하는 경우에 많이 사용하고 _getch()는 어떠한 입력이 발생했음 그 자체를 감지하는 목적성이 강하다.

getchar()함수의 경우 이미 버퍼에 입력된 정보가 있다면 그것을 가져와 반환하지만 _getch() 함수는 입력과 동시에 즉시 반환하며 사용자가 입력할 때 그 문자가 화면에 보이지도 않는다. 

만약 _getch() 함수를 코드에서 사용할 경우, 반드시 <coin.h>를 포함해야 한다.

 

3번)

gets()함수가 가진 보안 결함을 대체할 수 있는 함수는 다음과 같다.

우선 윈도우의 경우 gets_s() 함수를 사용하는 방법이 있는데 이 함수를 사용하면 버퍼 오버플로우에 의한 오버런을 막을 수 있다. 만약 정보가 입력될 메모리의 길이보다 더 큰 입력이 있을 경우 에러 처리를 바로 하기 때문에 해킹 위험이 적은 것이다.

한편 gets_s() 함수는 윈도우에서만 실행이 가능하기 때문에 리눅스 등에서도 적용하려면 fgets() 함수를 사용해야 한다. 

 

4번)

부호가 있는 10진 정수 형식으로 표현할 수 있는 가장 큰 양수는 2^31 -1 이다. 만약 여기서 1을 넘어서면 컴퓨터는 이 숫자를 -1로 인식한다.

 

5번)

부호가 없는 10진 정수 형식은 %u 형식 문자를 사용하면 되고 부호가 있는 10진 정수 형식은 %d를 사용하여 출력하면 된다.

 

6번)

123.45의 자료형은 float/double이며 이를 출력할 때는 %f를 사용하면 된다.

 

7번)

형식 문자 '%012.3F'가 의미하는 것은 소수점 부분을 포함해 전체가 12자리가 되며 소수점은 4번째에서 반올림하여 3째 자리까지 표현하라는 것이다. 그리고 오른쪽 빈공간은 0으로 채운다.

 

8번)

배열에 담긴 문자열을 출력할 때는 %s 형식 문자를 사용하면 된다.

 

9번)

입력 버퍼에 남은 개행문자를 제거하는 방법은 다음과 같다.

우선 getchar() 해서 개행 문자를 버퍼에서 가져오거나 윈도우의 경우 fflush() 함수를 통해 인풋을 모두 없앨 수 있다. (리눅스는 fpurge()가 있다)

혹은 scanf() 로 입력을 받을 때 형식 문자 마지막에 %*c를 추가한다. 여기서 *이 '버림'을 의미한다.

 

10번)

scanf("%d", nInput);

 

이 코드에서 잘못된 점은 변수의 주소가 아니라 그냥 변수명을 썼다는 것이다. nInput 대신 &nInput으로 고쳐야 한다.

 

11번)

double형 실수를 입력 받으려면 %f를 사용하면 된다.