C언어 scanf_s 함수 사용 방법 | 안전한 문자열 입력 처리

C언어 입력 함수 때문에 경고 메시지나 오류를 해결하려고 고민할 필요는 없다.

scanf를 계속 사용하는 것보다, 입력 크기를 명확히 관리하는 scanf_s를 사용하면 해결할 수 있다.

scanf_s는 단순한 대체 함수가 아니라, 안전한 입력 처리를 전제로 만들어진 함수이다.

C언어 scamf_s 함수 사용
C언어 scamf_s 함수 사용

1. scanf_s 함수란?

scanf_s는 scanf와 동일한 역할을 하지만, 입력 크기를 강제하는 보안 강화 함수이다.

즉, 입력 과정에서 발생할 수 있는 버퍼 오버플로우를 원천적으로 차단한다.

2. scanf_s와 scanf의 차이점

두 함수의 기능은 같다. 문자열 텍스트를 입력받는 후 화면에 출력한다.

scanf_s 함수는 C언어에서 안전한 입력 처리를 위해 사용된다.

scanf 함수는 입력 크기를 제한하지 않기에 보안과 메모리 문제가 발생할 수 있는 반면,
scanf_s 함수는 문자열 입력 시 반드시 버퍼 크기를 명시하는 것이 차이점이다.

Visual Studio 환경에서는 보안 강화를 위해 scanf 대신 scanf_s 사용을 권장한다.

3. scanf_s 문자열 입력 규칙

scanf 함수를 사용해 문자열 입력 시에는 반드시 버퍼 크기를 함께 전달해야 한다.
그렇지 않은 경우, 컴파일 오류 또는 런타임 오류가 발생한다.

핵심 원칙은 입력 받을 수 있는 최대 크기를 명확히 지정하면 된다.

scanf_s( 형식 문자열 , 입력 변수 , 버퍼 크기);

4. Visual Studio에서 scanf_s를 권장하는 이유

굳이, 개발 환경의 경고를 무시하면서 개발할 필요는 없지만, Visual Studio가 scanf_s 함수를 권장하는 이유는 보안 취약점이 발견되었기 때문이다.

scanf 함수를 사용하여 잠재적 메모리 침범( buffer-overflow)을 사전에 방지할 수 있다.

실무 및 학습 환경에서 입력 안정성을 확보하려면 scanf_s 함수 사용이 적합하다.

5. scanf_s 사용 시 자주 발생하는 오류

입력 함수의 대부분은 문자열 크기 인자를 전달하지 않았기 때문에 오류가 발생할 수 있다.

이런 경우, 인자값과 버퍼 크기를 정확히 명시하면 해결된다.

6. 예제 코드 & 실행 결과

C언어의 scanf_s 는 사용자가 입력한 문자열을 입력받고 화면에 출력한다.
보안 안정성과 안전한 입력을 위해 인자로 메모리의 버퍼 크기가 필요하다.
( 메모리 버퍼 크기는 변수에 할당된 크기라 볼 수 있다. )

아래는 C언의 scanf_s 함수 사용 방법에 대한 코드이다.

#include <stdio.h>

/* 함수 선언 */
void Call_Scanf_S(void);

/* 프로그램 시작 */
int main(void)
{
    printf("\n----- Start 05-Scanf function \n\n");

    /* 프로그램 종료 */
    Call_Scanf_S();

    printf("\n----- End \n\n");

    /* 정상 종료 */
    return 0;
}

void Call_Scanf_S(void)
{
    char input_text[255] = "";

    printf("너의 이름은~? 君の名は~? \n");
    printf("=> ");

    scanf_s("%s", input_text, (unsigned int)sizeof(input_text));

    printf("%s", input_text);
}

위의 코드를 보면 scanf_s 함수의 사용 방법을 볼 수 있다.

순서대로 형식문자열, 입력 변수, (변수)메모리 크기를 지정하고 있다.

부가적으로 unsigned int 를 굳이 명시한 이유는 scanf_s 경고(warning) 때문인데, 이것 또한 정확하게 명시를 함으로써 메모리 크기가 unsigned int 범위에 있다는 것을 정하는 것이다.

즉, 이것 또한 안전한 입력 처리를 위한 것에 있다.

이제 코드의 실행결과를 보자.

예제 코드 실행 결과
예제 코드 실행 결과

C언어에서 안전한 입력 처리를 원한다면 scanf_s를 사용하면 되며, 입력 인자 3가지인 입력 문자열, 입력 변수, 메모리 크기는 지정하도록 한다.
( 단순히, 권장하는 규칙을 따르면 그만이다. )

댓글

챗지피티 코덱스와 깃허브 연동 방법 | VSCode 사용하기

이미지
챗지피티의 코덱스( Codex )와 깃허브( Github )를 연결하려고 했지만, 연결이 되지 않아 VSCode에서 직접 연결을 하였다. VSCode에 깃허브를 직접 연결하니 오히려 더 좋은 느낌이다. 코덱스에 프롬프트를 실행하면 자동으로 파일을 만들고 나는 그저 깃허브에 저장소를 만들고 푸시( Push )만 하면 된다. 오히려, 챗지피티 코덱스 페이지에서 연결이 제대로 되지 않은 것이 다행(??)이란 느낌이다. 새로운 것을 시도해 보고, 좀 더 편한 방법을 찾았기 때문이다. 왜 연결이 되지 않는 거냐 ?? 좀 편하게 작업하려고 코덱스( Codex )에 깃허브( Github )를 연결하고자 했다. 인증까지 하고, 윈도우 자동 인증까지 삭제하고 다시 했음에도 연결이 되지 않았다. 아~ 뭐지 ? 찾아보니 버그라고 하는데 ~ 몇 일 동안 계속 이어지는 것 보면 이건 뭔가 문제가 있다고 볼 수 밖에 없다. ( 그 원인과 해결책을 찾을 수가 없다. ) 아아 ~ 코덱스 ~ 인증까지 했는데 깃허브 연결이 왜 안되냐 ~ 다행스럽게도 VSCode에서 연결이 된다는 것을 찾게 되었다. 잘 모르겠는 화면에서 익숙한 아이콘과 제목이 눈에 보였다. 바로 ` IDE에서 시도해 보기 ` 버튼이었다. VSCode에서 할 수 있다는 얘기는 들었지만, 이렇게 보여주니 시도해 보는게 당연하겠지. 일단 자세한 내용을 찾아보니 이미 많은 분들이 VSCode에서 챗지피티의 코덱스를 연결해 사용하고 있었다. VSCode가 깃허브에도 연결되니, 생각해 보면 굳이 코덱스를 웹에서 할 필요는 없겠다는 생각이 들었다. 바로 시도를 해 본다. 새로운 방법을 찾다. 이런 새로운 방법을 찾게 되면 왠지 모를 도파민이 생기는 느낌이다. 어쨌든 VSCode를 실행하고 코덱스를 설치하게 되었다. 평소 웹에서 작업하다보니 VSCode에 설치된 코덱스가 익숙하진 않다. 뭐, 걱정할 필요는 없다. 화면을 캡쳐하고 챗지피티 또는 제미나이에 캡쳐화면 자체를 업로드하고 물어보면 된다. 화면 우측 하단에 프롬프트 입력창이 있다. ...

이 블로그의 인기 게시물

ChatGPT Codex GitHub 연결 해제 방법 (앱 삭제까지 정리)

C언어 return 종류와 차이 | return, return 0, return -1, return n

UWP 지원 종료 확정? 2025년 이후 WinUI3 전환해야 하는 이유