본문 바로가기
Language&Framework&Etc/C연습문제

독하게 시작하는 C프로그래밍 연습문제(표준 입출력 도구)

by 머리올리자 2017. 6. 10.

출처 : http://cafe.naver.com/windev.cafe?iframe_url=/CafeMemberNetworkView.nhn%3Fm=view%26memberid=cx8537


3-1 

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

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


 입력: Test

 출력: e



답 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;
}


해설

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로 채운 수입니다.


여기서 +1이 된다면 부호비트가 1이고 나머지는 0인 수가 되는데,

이 수는, 곧 2의보수표기법으로 치자면 음수 중에서 가장 작은 수를 의미합니다.