Scanf 함수의 반환값
Scanf 함수의 반환값에 대해 알아보자.
기본적인 반환값
scanf도 값을 반환하는 함수이다. 입력에 성공한 개수 만큼을 반환한다.
scanf(“%d %d”, &a ,&b);의 경우를 보자.
- 1, 2를 입력했다면 올바른 자료형으로 잘 입력했으므로 2를 리턴.
- a, 1를 입력했다면 처음부터 잘못 입력받았으므로 0을 리턴.
- a b 를 입력했다면 둘 다 잘못 입력했으므로 0을 리턴.
- 1, a 를 입력했다면 첫 번째만 잘 입력했으므로 1을 리턴.
참고 : https://donggod.tistory.com/55
특수한 반환값
scanf는 에러가 발생하거나 EOF를 만나면 -1을 리턴한다.
그렇다면 입력을 넣어서 EOF까지 쭉 입력을 받고 싶다면?
- while(scanf() != EOF)
- while(scanf() != -1) (EOF는 macro 상으로 -1과 값이 동일하다)
- while(~scanf()) **중요!
**-1은 이진수 상으로 1111111… 이므로 ~ 비트 부정 단항 연산자를 이용해서 모든 자리의 비트값을 0으로 바꾸어주면 된다. 즉 ~-1은 1111111…. -> 0000000…. 으로 바뀌는 것.
따라서 3번은 정상적인 리턴 (0 혹은 자연수)일 경우에는 그 숫자의 보수를 출력하다가 EOF를 만날 때만 0을 리턴해서 while루프에서 탈출한다! (integer 자료형에서 -1의 보수는 0이다)