티스토리 뷰
#include <cstdio>
int main()
{
char data[2] = "";
scanf("%s", data);
printf("%s\n", data);
return 0;
}
에러 메세지를 보면 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
'컴퓨터 언어 공부 > C & C++' 카테고리의 다른 글
"const char *" 형식의 값을 사용하여 "char *" 형식의 엔터티를 초기화할 수 없습니다. (0) | 2019.10.31 |
---|---|
(C++) 파일 열기와 닫기 (0) | 2019.10.23 |
(C++) C++에서 C 헤더 쓰는 법 (0) | 2019.09.20 |
(C++) string 클래스의 다양한 함수들 (0) | 2019.09.20 |
main() 함수는 정수 값을 운영체제에 반환한다 (0) | 2019.09.03 |
댓글