필수실습문제 )
3-1 사용자로부터 이름과 나이를 입력받아 한 번에 출력하는 프로그램을 작성합니다. 이름을 입력받을 때는 gets( ) 함수를 사용하고 나이는 scanf( ) 함수로 입력받아야 하며, 두 정보를 printf( ) 함수로 한꺼번에 출력합니다.
입력 예:
나이를 입력하세요 : 20
이름을 입력하세요 : 철수
출력 예:
당신의 나이는 20살이고 이름은 '철수'입니다.
연습문제 )
3-1 getchar() 함수를 호출하여 사용자로부터 영문 네 글자 이상을 입력받고, 그중에서 두 번째 글자만 화면에 출력하려
합니다. 다음 입출력 예를 보고 같은 결과를 얻을 수 있도록 프로그램을 작성합니다.
입력: Test
출력: e
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 프로그래밍 (최호성, 루비 페이퍼)
[출처] 3-4 정수 오버플로우 (널널한 Windows 개발자 되기) |작성자 널널한 개발자
'Programming > C language' 카테고리의 다른 글
Chpater 04. 연산자 기본 (문제 풀이) (0) | 2017.03.07 |
---|---|
Chapter 04. 연산자 기본 (내용 요약) (0) | 2017.03.07 |
Chapter 03. 표준 입출력 도구 (내용 요약) (0) | 2017.03.06 |
Chapter 02. 자료형 (내용 요약) (0) | 2017.03.05 |
Chapter 01. 프로그래밍 입문 (내용 요약) (0) | 2017.03.05 |