C언어로 코드를 작성하다 보면 scanf 함수를 사용했을 때, 반환 값이 무시되었다는 경고가 뜨는 것을 많이 볼 수 있습니다.
이 경고가 왜 발생하는 것인지 알아내기 위해 이제부터 scanf 함수를 분석할 것인데, 그 순차는 다음과 같습니다.
1. 반환 값이 무시되었다는 게 무슨 뜻인가?
2. 반환 값이 무시되는 게 왜 문제인가?
3. 무시된 반환 값이 무엇인가?
4. 이 경고를 없애는 방법은 무엇인가?
1. 반환 값이 무시되었다는 게 무슨 뜻인가?
우선, 반환 값은 함수의 결과를 알리기 위해 함수를 호출한 곳에 보내는 값이라는 의미를 가진다는 것을 알아야 합니다.
예로, 두 정수를 인자로 넣어 보내면 그 두 수의 합을 반환하는 add 함수는, 두 수의 합이라는 결과를 자신을 호출한 곳에 보냅니다. 한 마디로 add(1, 2); 는 3; 이 된다는 것입니다. 여기서 3은 add 함수의 반환값이 됩니다.
그런데 개발자는 코드를 짤 때 (add함수가 위 역할만 한다면) add(1, 2); 같은 코드는 넣지 않습니다. 이 add(1, 2);, 즉 3;은 프로그램에 아무런 영향을 주지 않기 때문입니다.
개발자는 분명 반환 값을 사용하기 위해서 이 함수를 만들었을 테고, add(1, 2); 만 쓰는 것은 반환 값을 전혀 사용하지 않는 잘못된 사용법입니다. 다시 말해서 반환 값을 무시했다는 것입니다.
scanf 함수도 마찬가지 입니다. 반환 값을 사용하지 않은 것을 무시했다고 표현한 것입니다.
2. 반환 값이 무시되는 게 왜 문제인가?
위에서 말했듯이, 함수에 반환 값을 만들었다는 것 자체가 개발자가 반환 값을 사용하려 했다는 걸 뜻합니다. 그래서 컴파일러가 '이 반환 값 사용 안 했는데?' 하고 경고해주는 것입니다. 반환 값을 사용할 생각 없으면 그냥 실행해도 문제 없습니다.
3. 무시된 반환 값이 무엇인가?
다시 한 번 반복하자면, 반환 값은 함수의 결과를 알리기 위해 함수를 호출한 곳에 보내는 값이라는 의미를 가졌습니다. 이 의미를 알고 있으면, 무시된 반환 값은 scanf 함수에 (ex)"%d", &num을 보냈을 때, scanf 함수를 호출한 곳으로 scanf 함수가 보낸 값이란 걸 알 수 있습니다.
scanf 함수의 코드를 보고 scanf 함수가 보낸 값을 확인하겠습니다. (Ctrl+scanf클릭)
1046줄 부터 시작해서, 대략 500줄 가량의 코드가 전부 scanf 함수를 나타내는 코드입니다. 하지만 이러한 코드는 C언어를 아주 깊이 배우지 않았다면 해석이 불가능합니다. 코드만 읽고서는 scanf 함수의 반환 값을 확인할 수 없는 것이지요. 따라서 반환 값을 확인하려면 직접 값을 받아서 확인해야 합니다.
scanf 함수의 코드를 읽을 수는 없어도 색으로 구분해서 함수의 반환 값 자료형을 찾을 수는 있습니다. 컴파일러, 색 테마에 따라 다르겠지만, 일단 비주얼 스튜디오 밝은 색 테마에서는 파란색이 자료형, 갈색이 함수이름을 나타냅니다. 그렇다면 갈색인 scanf 함수명 앞에 있는 파란색 int가 scanf 함수의 자료형이 된다는 게 보이겠지요?
int형 변수를 하나 선언해서 scanf 함수의 반환 값을 받아봅시다.
반환 값을 사용해서 경고가 사라진 것을 확인할 수 있습니다. 실행해보겠습니다.
위에는 두 가지만 첨부했지만, 다양한 숫자 값을 넣어봤습니다. 어떤 정수를 입력해도, int에 넣을 수 있는 값을 초과해 입력해도, scanf 반환 값은 1이 나왔습니다.
이번에는 정수형이 아닌 값들을 넣어보았습니다. 문자형을 넣으니 scanf 반환 값이 0이 나왔습니다. 이걸 보고 '입력 받을 때 문제가 생기면(=잘못된 자료형인 값을 넣으면) 반환 값이 0이 나오는 구나! 초과한 값을 넣었을 때는 1이 나왔으니까, 입력 값을 변수에 저장하는 과정에서 발생하는 문제는 고려하지 않는 걸까?' 생각했습니다.
이론상으로 scanf 함수는 서식문자로 입력 값을 받을 때 오류가 나면 0을 반환하고, 함수를 종료합니다.
(두 개를 동시에 입력 받으려고 할 때, 첫 입력 값에서 오류가 나면 두번째 입력 값은 아무 역할을 못하고 함수가 종료됩니다. 그리고 두번째 입력 값을 받으려 했던 변수에는 첫 입력 값, 즉 오류가 들어갑니다.)
그리고 입력받을 값의 개수가 scanf 함수의 반환 값이 됩니다.
문제는 실수형을 %d로 입력받았을 때 입니다. 두번째 사진을 보면 scanf 함수 반환 값이 1이 나왔는데, 실수형은 %d로 받을 때 오류가 나지 않는가? 에 대해서는 아직 자료를 찾지 못했습니다. 더 찾아보고 수정하겠습니다. 일단 지금까지 적은 내용으로도 충분히 scanf 함수 반환 값이 이해되리라 생각합니다.
4. 이 경고를 없애는 방법은 무엇인가?
(1)scanf를 쓸 때마다 _s를 붙이거나
(2) 프로젝트 우클릭 -> 속성
속성 페이지에서 C/C++ -> SDL 검사 -> 아니오 -> 우측하단 적용 버튼을 누르거나
(3) scanf 반환 값을 변수에 저장해서 사용하기
로 scanf 오류를 해결할 수 있습니다.