티스토리 뷰


#include <cstdio>

int main()
{
    char data[2] = "";
    
    scanf("%s", data);
    printf("%s\n", data);
    
    return 0;
}

에러코드 C4996

  에러 메세지를 보면 scanf 대신 scanf_s로 사용하라고 하는데 그 이유는 scanf가 구조적으로 안정적이지 않아 여러 위험을 안고 있는 함수이기 때문이다. 그러한 문제점을 보완하여 나온 것이 scanf_s 이다. VS2010 이상 컴파일러에서는 scanf_s 함수를 사용하도록 권장하고 있다.

  그렇다면 scanf_s 는 어떤 점이 달라진 것일까.

  기존 scanf 는 char 형이나 문자열을 넣을 때 받을 수 있는 문자열의 사이즈를 넣지 않아도 사용이 가능했었다. 그로인한 문제점이 바로 오버플로우(overflow)이다.

#pragma warning (disable:4996) //컴파일러 오류를 무시하기 위함
#include <cstdio>

int main()
{
    char data[2] = "";
    
    scanf("%s", data);
    printf("%s\n", data);
    
    return 0;
}

정상적인 값을 넣을 경우

입력값: a

출력: a


배열보다 큰 문자열을 넣을 경우

입력값: aa

출력: 아래 사진과 같은 에러가 발생


  이런 경우를 예방하기 위해서 나온것이 scanf_s

#include <cstdio>

int main()
{
    char data[2] = "";
    
    scanf_s("%s", data, sizeof(data));
    printf("%s\n", data);
    
    return 0;
}

배열보다 큰 문자열을 넣을 경우

입력값: aa

출력: 아래 사진과 같이 null 값을 반환


  scanf_s 함수는 에러메세지를 출력하지 않고 data에 아무런 값이 들어가지 않는다. 담을 수 있는 사이즈보다 큰 값이 들어오면 아예 값을 넣지 않는것이다. _s 함수를 사용하면 이런 에러메세지를 피할 수 있다.

  컴파일러는 _s 함수의 사용을 적극 권장하지만 잘못된 값이 들어왔을 때 에러메세지가 출력되는 것이 좋을 때가 많다. 어디에서 코드가 잘못 되었는지 찾기 쉽지 않을테니 말이다.


참고자료:https://hh4131.tistory.com/22

 

댓글