출처 : http://cafe.naver.com/windev.cafe?iframe_url=/CafeMemberNetworkView.nhn%3Fm=view%26memberid=cx8537
3-1
getchar() 함수를 호출하여 사용자로부터 영문 네 글자 이상을 입력받고, 그중에서 두 번째 글자만 화면에 출력하려고 합니다.
다음 입출력 예를 보고 같은 결과를 얻을 수 있도록 프로그램을 작성합니다.
입력: Test
출력: e
[출처] 3-1 getchar() (널널한 Windows 개발자 되기) |작성자 널널한 개발
답 1
#include <stdio.h>
int main(void)
{
getchar();
printf("%c\n", getchar());
return 0;
}
#include <stdio.h>
답 2
int main(void)
{
char test = 0 ;
test = getchar();
test = getchar();
printf("%c\n",test);
return 0;
}
[출처] 3-1 getchar() (널널한 Windows 개발자 되기) |작성자 보안솔루션
해설
getchar() 함수는 입력을 무한정 받지만, 결국은 첫번째 문자 한개만 하나만 불러오기 때문에
[출처] 3-1 getchar() (널널한 Windows 개발자 되기) |작성자 보안솔루션
3-2 getchar() 함수와 _getch() 함수가 내부적으로 다른 점은 무엇인지 기술하세요.
getchar() 함수를 호출하여 값을 임의로 하나를 저장받고,
printf()함수에서 getchar()함수가 한번더 호출되기 때문에, 두번째 값이 최종적으로 출력된다.(첫번째 값은 저장은 되지만, 다른 위치)
3-2 getchar() 함수와 _getch() 함수가 내부적으로 다른 점은 무엇인지 기술하세요.
getchar() 은 버퍼에 저장해 두었다가 하나씩 꺼내어 처리하는 방식,
_getch() 함수는 Non-buttered I/O, 즉, 버퍼를 거치지 않고 바로 출력.
3-3 gets() 함수는 보안결함이 있습니다. 이 함수를 대체할 수 있는 함수에는 어떤 것이 있는지 기술하세요. 추가로, 결함의 원인도 기술해보기 바랍니다.
gets() 함수는 입력버퍼을 검사하고, 빈 버퍼에 저장을 합니다.
보안적으로 안전하지 않은데, 그 결함은 버퍼 오버플로우에 의한 버퍼 오러런 공격에 대한 취약성 인데,
버퍼크기에 대한 제한을 두지 않았기 때문에, 다른 프로세서의 버퍼를 건드려, 치명적인 오류를 발생시키는 해킹 가능
따라서 gets_s() 함수를 대체해서 사용하는데, 허가된 메모리 이상을 사용할 경우, 프로그램이 비정상 종료가 됩니다.(크기 검사(sizeof)
3-4 만일 부호가 있는 10진 정수 형식으로 표현할 수 있는 가장 큰 양수의 범위를 1 넘어서면 컴퓨터는 이를 어떤 숫자로 인식하는지 기술하세요. (이유도 설명해주기 바랍니다!)
ㅁ ㅁㅁㅁ ㅁㅁㅁㅁ ㅁㅁㅁㅁ ㅁㅁㅁㅁ
(부호)
가장 큰 양수는, 부호비트가 0인 상태로 나머지 비트는 1로 채운 수입니다.
[출처] 3-4 정수 오버플로우 (널널한 Windows 개발자 되기) |작성자 임은섭