최신 버전의 Visual Studio 를 쓰면 scanf 경고로 인해 컴파일이 되지않는다.
때문에 scanf를 scanf_s로 바꾸어 주어야한다.
scanf는 예전부터 써오던 standard console io(stdio)의 input 함수입니다. 이 함수는 참 범용적으로 사용되는데, 최근 몇 년동안 보안의 문제에 직면하면서 수정을 가한 것이 scanf_s입니다. scanf_s는 scanf와 거의 똑같지만, character와 character pointer를 입력받는 경우는 버퍼의 크기를 하나 더 적어 넣어줘야 합니다.
char c;
char s[10];
scanf("%c %s", &c, 1, s, 10);
그 이유는 버퍼 오버런, 버퍼 오버플로우를 이용한 공격을 방어하는 목적입니다. 좀 자세히 설명하면, 버퍼의 크기를 정해주지 않는 경우, 그 버퍼에 실행코드를 함께 넣으면서, 그 실행코드로 jump하게하는 기술을 사용하면, scanf등을 이용해 입력을 받는 프로그램을 통해 외부의 실행코드가 실행될 수 있게 되고, 그 실행으로 바이러스를 옮기는 등의 악성 프로그램을 실행하게 될 수 있습니다. 이런 것을 막기위해 많은 standard C의 함수들이 보안 기능(security --> 그래서 s가 붙지요)을 추가한 함수로 변경되고 있습니다
하지만 이걸 그냥 사용하면서 위처럼 약간의 문제점이 생기게 된다.
문자형 char를 사용하여 문자또는 문자열을 입력 받을 수 없을 것이다 (위에서 설명했다 싶이, 버퍼의 크기를 지정해 주어야한다.)
두번째 방법은 scanf_s를 사용하지않고 scanf를 그대로 사용하는것이다.
이것은 scanf 경고를 제거하여 기존의 scanf 사용이 가능하다. 이제는 문자형도 입력을 받을 수 있다.
#pragma warning(disable:4996)
해당 코드를 #include<stdio.h> 처럼 상단에 입력하면 더이상 scanf경고가 나오지 않을것이다.
출처 : enter님 티스토리
'개발자 > C' 카테고리의 다른 글
C언어 진법변환 (0) | 2015.09.29 |
---|---|
C언어 숫자 5개 입력받아 세자리수 만들기 (0) | 2015.09.29 |
C언어 대시 수 세기 (0) | 2015.09.29 |
C언어 초침과 분침이 직각을 이룰때 시각 구하기 (0) | 2015.09.29 |
C언어 소수놀이, 소수구하기 (0) | 2015.09.29 |