반응형
Microsoft Visual Studio 2017 Community버전을 쓰다보면 scanf를 쓰게되면 scanf_s로 쓰라고 권장을 하면서 오류가 난다.
scanf와 scanf_s함수는 표준 입력하는데 있어서 쓰이는 함수이다. 차이점이라면 scanf_s는 scanf의 버퍼 오버플로우등 다양한 보안상의 문제를 보안한 함수이다.
최상위 버전에서는 SDL, Security Development Lifecycle검사가 체크되어있어 비주얼 스튜디오에서는 scanf_s가 없으면 오류가 난다.
scanf, scanf_s의 문법은 거의 동일하다. 단 %s 를 통한 문자열을 받을 때는 입력개수를 인자로 한개를 더 넣어주어야 한다.
일반적인 gcc-compiler상에서 문자열을 받는다면(gcc의 대표적인예시 : Dev-C++, Sublime Text - standard gcc를 올려 사용하는 경우)
1 2 3 4 5 6 7 | #include<stdio.h> int main() { char ex[10]; scanf("%s", ex); } | cs |
일반적인 MS Visual Studio에서 %s로 문자열을 받으려면
1 2 3 4 5 6 7 8 | #include<stdio.h> int main() { char ex[10]; scanf_s("%s", ex, strlen(ex)); return 0; } | cs |
다음과 같이 일반적인 scanf보다 인자를 하나 더 추가해 주어야 한다. Visual Studio에서 작성할때 strlen()을 통한 문자열의 길이를 꼭 지정해 주지 않아도 오류로 뜨지는 않을꺼다(빨간줄) 하지만 실행하면 프로세스가 중단되는 현상이 생길 것이다. 즉 가시화 되지 않는 오류인 것이다.
이를 조금 응용해 보자. 만약 문자열도 받아야 하고 그 다음에 숫자도 받아야 된다고 하자.
1 2 3 4 5 6 7 8 9 | #include<stdio.h> int main() { char ex[10]; int a, b; scanf_s("%s, %d, %d", ex, strlen(ex),&a,&b); return 0; } | cs |
반응형