본문 바로가기

Programming/C language

chapter 03. 표준 입/출력 도구 (문제풀이)


필수실습문제 )


3-1 사용자로부터 이름과 나이를 입력받아 한 번에 출력하는 프로그램을 작성합니다. 이름을 입력받을 때는 gets( ) 함수를 사용하고 나이는 scanf( ) 함수로 입력받아야 하며, 두 정보를 printf( ) 함수로 한꺼번에 출력합니다. 


입력 예:

나이를 입력하세요 : 20

이름을 입력하세요 : 철수

출력 예:

당신의 나이는 20살이고 이름은 '철수'입니다. 





연습문제 )


3-1 getchar() 함수를 호출하여 사용자로부터 영문 네 글자 이상을 입력받고, 그중에서 두 번째 글자만 화면에 출력하려

합니다. 다음 입출력 예를 보고 같은 결과를 얻을 수 있도록 프로그램을 작성합니다.


입력: Test

출력: e



[출처] 3- g

3-2 getchar() vs _getch() (널널한 Windows 개발etchar() (널널한

 Windows 개발ㅇㅇㅇ자 되기) |작성자 널널한 개발자


3-2 getchar() 함수와 _getch() 함수가 내부적으로 다른 점은 무엇인지 기술하세요.


getchar() 함수는 Buffered I/O 방식을 사용해 키보드로 입력받은 문자를 kernel이 stdin Buffer에 입력해주면 그 문자를 가져오는 함수이고,

_getch() 함수는 Nonbuffered I/O 방식을 사용해 Buffer를 거치지 않고 키보드 인터럽트를 캐치해 문자를 가져오는 함수이다.

 

[출처] 자 되기) |작성자 널널한 개발자



3-3 gets() 함수는 보안결함이 있습니다. 이 함수를 대체할 수 있는 함수에는 어떤 것이 있는지 기술하세요. 추가로, 결함의 원인도 기술해보기 바랍니다.


gets() 함수는 입력받는 data의 크기를 지정해주지 않기때문에 지정해준 memory보다 크기가 큰 data를 입력하면 Buffer overflow가 발생할 수 있다. 

이를 대체하기 위한 함수로는 gets_s() 함수가 존재한다. 



3-4 만일 부호가 있는 10진 정수 형식으로 표현할 수 있는 가장 큰 양수의 범위를 1 넘어서면 컴퓨터는 이를 어떤 숫자로 인식하는지 기술하세요. (이유도 설명해주기 바랍니다!)


가령 부호가 있는 8bit 크기의 정수라면 가장 큰 양수의 범위는 01111111(2)가 될 것이며 이 수는 127이 된다. 

이 수에 1을 더하게되면 10000000(2)이 되는데, 가장 앞의 자리 수가 1이면 음수가 되므로 이를 2의 보수를 취하면 01111111(2) + 1(2) = 10000000(2)이 된다. 이 크기는 128 이고, 이 수에 -를 붙이면 -128이 된다. 



3-5 부호가 없는 10진 정수 형식과 부호가 있는 10진 정수 형식을 출력하기에 적절한 형식 문자는 각각 무엇인지 답하세요.


부호가 없는 10진 정수 형식 : %u

부호가 있는 10진 정수 형식 : %d



3-6 123.45의 자료형은 무엇이며 이 값을 출력하기에 적절한 형식 문자는 무엇인지 답하세요. 


123.45의 자료형은 double 형이며, 같은 실수형인 float 형의 상수라면 123.45F로 적어야한다. 

double형을 출력하기 위해서 필요한 형식 문자는 %lf이다. (%f를 사용해도 문제없긴하다.)  



3-7 형식 문자 '%012.3F'가 의미하는 것은 무엇인지 기술하세요. 


소수점 4번째 자리에서 반올림 해서 3째 자리까지 표기하며, 

숫자를 실수부, 소수부 포함 총 12자리 출력, 

부족한 앞 부분의 실수부는 0으로 출력한다. 


ex) 123.45를 출력한다면 

000000123.450


-> 라고 생각 했으나, 소수점( . )을 포함한 12 자리였다. 


그러므로 123.45를 출력한다면 

00000123.450 이 출력된다. 



3-8 배열에 담긴 문자열을 출력하려 합니다. 적절한 형식 문자는 무엇인지 답하세요. 


%s



3-9 scanf( ) 함수로 정수를 입력받은 후, 입력 버퍼에 남은 개행문자를 제거하려 합니다. 

어떤 방법이 있는지 모두 기술하세요. 


scanf("%d%*c", &a); 와 같이 %*c 형식 문자를 사용하면 개행문자를 제거할 수 있다. 


fflush(stdin) 을 사용하면 개행문자를 제거할 수 있다. 하지만 fflush( ) 함수는 표준에 따르면 출력 버퍼만 삭제할 수 있는데, 윈도우 에서만 입력버퍼를 지울 수 있도록 지원해 준다. (리눅스, mac등의 운영체제에서는 사용할 수 없는 방법이다.) 


fpurge(stdin) 을 사용하면 리눅스, mac등의 운영체제에서 입력 버퍼를 삭제할 수 있다. 


while( getchar() =! '\n' ); 와 같은 방법을 사용하기도 한다. 



3-10 만일 nInput이 정수형 변수라면 다음 코드는 무엇이 잘못되었는지 기술하세요. 


scanf("%d", nInput);


scanf를 이용해서 입력을 받을 때 nInput이 아니라 &nInput을 이용해서 nInput이라는 변수의 주소를 전달해 주어야한다. 



3-11 scanf( ) 함수로 double형 실수를 입력받으려 합니다. 적절한 형식 문자는 무엇인지 답하세요. 


%lf 를 이용해서 받아야한다. 


printf( ) 같은 경우에는 %f와 %lf를 따로 구분하지 않지만 scanf( )에서는 구분한다. 

(그러니까 그냥 printf( )나 scanf( )나 다 구분해서 사용하면 애초에 햇갈릴 일이 없다. -구분해서 쓰자-)





- 출처 : 독하게 시작하는 C 프로그래밍 (최호성, 루비 페이퍼)