반응형

지금부터 윤성우 저 열혈강의 C프로그래밍 책에 있는 도전! 프로그래밍을 주욱 풀어나갈 것입니다.

제가 여기서 제시해드리는 코드는 '모범답안'이 아니라, '여러가지 답 중 하나' 입니다. 

사람마다 코딩하는 스타일은 다르고, 코드의 효율성도 다릅니다. 

제가 제시하는 한가지의 답을 보고, 더 효율적이고 좋은 방법이 있는지를 토론하고 하면서 배워나가면 좋을것 같습니다. 

 

 

도전1. 10진수 정수를 입력받아서 16진수로 출력하는 프로그램을 작성해 보자. 

서식문자의 활용에 대한 문제이므로 쉽게 해결할 수 있을 것입니다.

 

일단 프로그래밍을 하기 앞서, 의사코드를 먼저 만들고 그다음 C언어로 옮기는 것을 습관들이면 좋다는 것을 알려드리고 싶습니다. 

현재 문제와 같은 간단한 문제는, 의사코드를 굳이 만들어서 할 필요는 없겠지만, 

프로그램의 크기가 커지고 복잡성이 커지면, 의사코드를 만들지 않고서는 뒤죽박죽.. 코딩을 하게 됩니다. 

의사 코드는 건축을 하기에 앞서 설계도를 그린다고 생각하시면 되겠습니다. 

 

의사코드 (이번 문제에서 의사코드는 꼴랑 한줄입니다. 이정도는 머리속으로 생각해도 충분할 것입니다.)

10진수를 입력받은뒤, 16진수 서식문자를 이용하여 그대로 출력한다. 

 

 

코드입니다. (파일이름은 ch1.c 입니다) 

7번째 줄에서 10진수를 입력받아 

9번째 줄에서 %X서식문자를 통해 16진수로 출력합니다. 

 

출력결과 

네. 문제에서 원하는대로 잘 출력 됩니다. 

 

이렇게 해서 도전1 해결! 

 

 

 

 

 

 

 

 

 

하면 뭔가 아쉬운점이 있는데요. 

 

다음 출력결과를 보고 생각해보죠 

어? a를 입력한 결과와 aa를 입력한 결과가 똑같이 이상한 값이 나오네? 

111111111111을 입력하니까 이상하게 출력되죠. 

 

 

원인은 코드에 있습니다. 

다시한번 위에 코드를 살펴보죠 

5번째 줄을 보면 num 변수형태를 int로 초기화 하고 있습니다. 

int는 4바이트 정수형 표현으로 표현값은 -2^16 ~ 2^16 -1 입니다. 즉 

int가 표현할 수 있는 값의 범위가 넘어가면 Overflow 현상이 일어납니다. (엮인글 참조) 

Overflow 현상은 프로그램의 매우 치명적이며, 대표적인 해킹 수단중의 하나인 BOF(buffer overflow)에 매우 취약합니다. 

 

프로그램 코드를 수정해보겠습니다. 

9번째줄에서 14번째줄까지 추가된 내용입니다. 

9번째줄에서 입력받은 변수의 값이 int 타입의 범위 안에 오버플로우가 발생하지 않게 저장할 수 있는지를 확인하여, 

만약 int 타입의 저장공간보다 큰 입력값이 들어오면 

오류메세지를 출려하고 프로그램을 종료합니다. 

 

제가 int의 범위를 착각하고 -32768 에서 32767로 하라고 했는데 실제 범위는 더 큽니다. ㅋㅋㅋ

코드 수정하긴 귀찮고... 제가 실수했다는걸 꼭 알고 넘어가시면 될 것 같습니다. 

 

실행결과입니다. 

자 진짜 끝입니다. 

 

마지막으로, 

이렇게 쉬운 프로그램인데 저렇게까지 입력값을 검사하고 하는 필요가 있나요?? 

 

미리 습관을 들여놓는 것입니다. 

열혈강의 책의 윤성우 저자도 프로그래밍 습관을 잘 들여놓는것이 나중을 위해 좋다고 하였습니다. 

점차 프로그램이 커져도, 잘 쪼개보면 한가지 기능을 하는 함수가 여러가지 모여서 이루어진 큰 프로그램입니다. 

이렇게 하나하나 오류가 발생하는것을 미리 방지하는 장치를 마련해놓으면, 

나중에 내가 만든 프로그램이 오작동 할 확률을 줄일 수 있습니다. 

 

이상입니다. 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기