"입력값이 제대로 출력이 안됩니다." , "무한루프를 돌아요"

많은 C입문자가 프로그래밍을 하다 물어본다는 사실을 알게 되었다..

간단한 경우는 프로그래머의 실수로 출력부분이나, 루프 탈출조건을 잘못 설정 했을 경우지만

많은 경우가 scanf에서 일어나는 것을 인지 하지 못한다는 사실에 글을 작성해본다.

scanf는 int형 자료와 char형 자료를 모두 입력 받을 수 있다.

"가장 많이 실수하게 되는 부분이 int형 입력에 char형을 입력하는 경우이다."

char형도 내부적으로 ASCII 값으로 변환되어 처리가 되기 떄문에

"Syntax Error" 나 "Compile Error" 는 발생하지 않는 경우가 대부분이다.

그렇지만, 사용자가 요구하는 입력 데이터형이 int형일 경우

"Run Time Error"가 생기게 된다.

이를 방지하기 위해서는 Valid Input을 해주어야 하는데.

이것은 scanf라는 library함수가 어떻게 동작하는지를 살펴보면 간단히 해결할 수 있다.

scanf는 가변인자와 return value를 갖는다.

다음은 MSDN에서 발췌한 내용이다.

Return Value

Both scanf and wscanf return the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. The return value is EOF for an error or if the end-of-file character or the end-of-string character is encountered in the first attempt to read a character.

scanf는 성공적으로 입력을 받으면 field의 갯수(서식명세서의 갯수) 를 return하고 error 발생시 0을 리턴하게 되므로 정상적으로 입력이 되었는지 알아보기 위해 scanf의 return 값이 0인지 아닌지를 확인해주기만 하면 된다.

따라서, 코드 내부에 다음과 같은 valid input code를 삽입해 주면 된다.



여기서 한가지 주의할 점은, 이 프로그램은 입력 값을 1개로 받고 있다.
입력을 2 2 2와 같은 식으로 입력하여도 input에 저장되고 남은 2 2는 버려지게 된다.
즉, scanf는 1개의 필드값에 정상적으로 값을 입력했다는 표시로 필드의 갯수 1을 return 한다.

+ Recent posts