아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
까칠한가젤63
까칠한가젤6321.05.24

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를 사용했습니다

55글자 더 채워주세요.
답변의 개수
9개의 답변이 있어요!
  • 오류메시지에 나오듯이 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;

    }

    [실행결과 캡쳐]