Technology/C & C++

scanf 와 scanf_s

문베디드 2014. 3. 10. 14:35

scanf_s() 사용시 입력받은 문자가 제대로 출력 안되는 문제발생!

VS 2005이후부터 scanf가 아니라 scanf_s를 써야 하는거였군... 바보가 된 느낌 ㅋㅋㅋ 그래도 사용법을 알았으니 다행이다 ㅎㅎ

scanf("%s", buffer)에서는 예시처럼 변환명세와 저장할 변수명을 써주면 되고 
scanf("%s", buffer, sizeof(buffer))에서는 세번째 인자(parameter)로 버퍼 크기를 입력해줘야 한다.

scanf 가 버퍼 크기를 고려하지 않고 입력 받는것때문에 scanf_s에서는 버퍼의 크기까지 인자로 받아서 동작하는것 같다. 아무래도 보안문제로 scanf를 안쓴다고 오류가 뜨니까 오버플로우같은걸 이용한 공격에 대비하기위해서인듯

Visual Studio 2012에서 과제하다가 scanf()사용시 나온 오류 메시지: 

error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files (x86)\microsoft visual studio 11.0\vc\include\stdio.h(290) : 'scanf' 선언을 참조하십시오.

무작적 scanf_s로 바꿔서 컴파일하니 컴파일은 되는데 제대로된 출력이 안나와서 디버거로 확인해보니 입력값이 깨져서 들어가있다. 한참 삽질하다가 연구실 후배 영근이 인터넷 검색해보라하니 바로 나왔다...-.-; 나는 바보로구나 ㅋㅋㅋ


참고 싸이트 http://alisa2304.tistory.com/106


덧.

sizeof와 비슷한 _countof 라는게 존재한는군

sizeof 는 데이터 크기를
_countof는 배열이 선언된 갯수를 나타낸다. 

즉 char buffer[10]이라는 변수가 있을때
sizeof(buffer)는 2바이트*10 = 20 (byte)를 뜻하고
_countof(buffer)는 배열의 갯수인 10을 나타낸다.!!

http://msdn.microsoft.com/en-us/library/ms175773.aspx