Language/C

scanf와 scanf_s에 대해서

Hoplin 2019. 1. 17. 15:25
반응형

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

scanf_s를 통해 문자열과 숫자를 같이 받아야 하는 경우라 하면 문자열 입력받고 해당 이스케이프 시퀸스와 동일한 자리에 문자열을 저장할 배열과 그 다음에 해당 배열에 대한 최대 문자열 입력개수를 작성해준 후 숫자를 받으면 된다.


반응형