Programming Language/C, C++

[C/C++] scanf, scanf_s 차이

요호유후 2025. 5. 29. 15:49
반응형

 

 

 

오랜만에 C언어 책 펼쳐서 보고 있는데

아주 야무~~지게 필기한 포스트잇 발!견!

 

 

그래서 정리 차 작성해본다.

 

1. scanf, scanf_s 란?
scanf, scanf_s 모두 C/C++ 언어에서 표준 입력을 처리할 때 사용하는 함수이다.

 

   💻 예시

#include <stdio.h>

int main(void)
{
    int age;
    char name[10];
    
    scanf("%d", &age);
    scanf_s("%s", &name, (unsigned int)sizeof(name));
    
    printf("&s님 나이는 %d살입니다.\n", name, age);
    
    return 0;
}

 

2. scanf, scanf_s 차이점
보안성과 사용환경에서의 차이점이 있다.

📌 보안성 : 특히 문자, 문자열의 경우 버퍼 오버플로우 방지를 위해 scanf_s를 사용
📌 사용환경 : Visual Studio에서는 scanf 대신 scanf_s 사용을 권장
                      (빌드 시 에러는 아니지만 경고메시지를 띄워줌)
구분 scanf scanf_s
보안성 낮음
(버퍼 오버플로우 위험 있음)
높음
(입력 길이 지정 필수로 보안 강화)
사용환경 거의 모든 C 컴파일러에서 사용 가능 MSVC에서 주로 사용

 

   💻 예시 (VS Code, GCC/Clang)

VS Code에서 scanf 함수를 문제 없이 사용할 수 있다.
scanf_s도 사용 가능한 것 처럼 보이지만 기본적으로 정의가 되어 있진 않음.

MSVC CRT 헤더가 일부 포함되어있는 경우 사용가능한 것 처럼 보일 수 있으니
VS Code에서는 웬만하면 scanf를 사용 하도록 하자.

그리고 리눅스(GCC), macOS(Clang) 환경에서는 기본적으로 scanf_s가 정의 되어 있지 않기에
scanf_s를 사용하면 오류가 발생한다.

 

 

    💻 예시 (MSVC)

MSVC는 특히 문자, 문자열 입력 시 scanf_s를 사용하는 것을 권장한다.
scanf_s를 사용하거나 #define _CRT_SECURE_NO_WARNINGS 를 사용하면 된다.

단, 정수와 실수 입력 시에는 scanf, scanf_s 둘 다 사용 해도 무방하다.
scanf("%d "%f", &x, &y);
scanf_s("%d "%f", &x, &y); // 위 라인과 동일하게 동작함

 

⭐ scanf 사용 시 버퍼 오버플로우 예방법

아래 예시와 같이 입력 길이를 지정해서 오버플로우 방지!

#include <stdio.h>

int main(void)
{
    char name[10];
    
    scanf("%9s" name);  // 최대 9글자 + \0 => 10
    
    return 0;
}

 

 

 

반응형