scanf 관련오류 어떻게 해야하나요?
#include <stdio.h>
#define CRTSECURENOWARNINGS
int main(void)
{
int count, i;
printf("숫자를 입력하세요\n");
scanf("%d", &count);
for ( i = 1; i < count; i++)
{
if (i % 2 != 0)
continue;
printf("%d\n", i);
}
return 0;
}
이런식으로 코딩을 했는데
이런 식으로 오류가 나는데 제가 뭘 잘못한걸까요??
Visual Studio를 사용했습니다
오류메시지에 나오듯이 scanf() 대신에 scanf_s()를 사용해 보세요.
아래 블로그에 오류에 대한 이유가 잘 설명되어 있습니다.
https://security-nanglam.tistory.com/126
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=msvc-160
공식 문서에도 블로그에 설명하는 내용이 다음과 같이 기재되어 있습니다.
Unlike scanf and wscanf, scanf_s and wscanf_s require you to specify buffer sizes for some parameters.#define 문장을 첫줄에 쓰셔야합니다
#include <stdio.h>
에서 stdio.h는 scanf함수를 포함하는 헤더 파일인데 이안에서 #define문장을 인식해야 합니다
소스컴파일시 윗줄부터 해석하여 컴파일 에러 체 크 하기때문에 위 두문장 순서가 바뀌어야 합니다
참고로 비쥬얼스튜디오 환경설정값을 바꾸어서 에러를 해결하는 방법도 있습니다
Visual Studio 2013버전 이상부터 scanf를 사용하면 질문자님과 같은 에러를 볼 수 있습니다.
해결은 여러가지 방법으로 할 수 있습니다.
1. scanf_s 사용하기
scanf_s("%d",&count,sizeof(10))
입력값의 크기를 지정해서 BoF 방지
2. 코드 최상단에 정의 추가
#define _CRT_SECURE_NO_WARNINGS
3. Visual Studio 설정 변경
3.1 솔루션 탐색기 > 현재 프로젝트 우클릭 > 속성 > 구성속성 > C/C++ > 전처리기 > 전처리기 정의 항목 수정
마지막 글자 뒤에 세미콜론(";") 입력 후 " _CRT_SECURE_NO_WARNINGS;" 입력
3.2 솔루션 탐색기 > 현재 프로젝트 우클릭 > 속성 > 구성속성 > C/C++ > 일반 > SDL 검사 > 아니오 선택
안녕하세요.
compiler의 setting때문에 그렇습니다. scanf는 buffer overflow취약점이 있기 때문에 scanf_s로 바꾸라고 이야기하는 것이구요,
기존의 source code를 그대로 써야 한다면
#define _CRT_SECURE_NO_WARNINGS를 넣어주시거나 project에서 SDL검사부분의 check를 빼주시면 됩니다.
그냥 새로 짜시는 거라면 scanf_s를 사용하시는 것을 권장드립니다.
감사합니다.
안녕하세요.
에러가 발생할 경우. 메세지를 잘 읽어보시길 바랍니다.
메세지에 문제의 원인과 해결할 수 있는 답도 들어 있습니다.
scanf 함수는 unsafe 안전하지 않은 함수이기 때문에 scanf_s 함수를 사용하라고 안내하네요.
scanf => scanf_s 함수로 변경해보시길 바랍니다. ^^
안녕하세요.
error message에서 말한것처럼 scanf는 보안 취약점이 있어서 scanf_s를 권장하고 있습니다.
scanf_s 사용 방법 : https://security-nanglam.tistory.com/126
그냥 scanf를 error message 없이 사용하는 방법 : https://security-nanglam.tistory.com/116
scanf 함수 대신 scanf_s 함수로 바꾸어 쓰시면 됩니다.
기존에 쓰던 scanf 함수에서 보안 관련한 문제점이 발생되어 비주얼 스튜디오 최신 버전에서는 scanf_s 함수를 쓰도록 하고 있기 때문입니다.
굳이 scanf 함수를 쓰시려면 메시지 창에 나오는 #define _CRT_SECURE_NO_WARNINGS를 #include 위에 작성하시고 이용하시면 될 것으로 보입니다.
아래의 블로그를 참고하여 설정해보세요.
https://bloodstrawberry.tistory.com/5
scanf는 보안 문제 때문에 비주얼 스튜디오에서 못쓰도록 권고하고 있습니다.
하지만 대부분 알고리즘 문제나 간단한 프로그램 공부로 쓰기 때문에 꼭 쓰시고 싶을텐데요.
해당 에러가 나타나지 않도록 설정을 하시면 됩니다.
Project -> 속성 -> 구성 속성 -> C/C++ -> 일반 -> SDL 검사 -> 아니오 로 변경하면 C4996 에러가 사라집니다.
출처 : http://squire3131.egloos.com/v/4349122
[수정소스]
#pragma warning(disable:4996) //안되면 이걸 맨위에 추가하면 해결됩니다.
#include <stdio.h>
#include <stdlib.h> //system 함수 사용을 위해
#define CRTSECURENOWARNINGS
int main(void) {
int count, i;
printf("숫자를 입력하세요\n");
scanf("%d", &count);
//scanfs("%d", &count); // vs 2005 이상 부터는 scanf 보다는 scanfs 사용을 권장
for (i = 0;i < count; i++) {
if (i % 2 != 0)
continue;
printf("%d\n", i);
}
system("pause");
return 0;
}
[실행결과 캡쳐]