C언어 study_scanf()와 scanf_s()

민성철·2022년 11월 2일
0

nadocoding_study_C

목록 보기
4/17
  • 이장은 이전 scanf()함수의 확장으로 작성하게 되었습니다.

보통 scanf()함수를 사용하여 입력값을 받습니다.
하지만, 입력값의 제한이 없어서 지정된 크기보다 더 많은 양을 입력받는 버퍼 오버플로(buffer overflow)라는 메모리가 문제가 발생할 수 있습니다.
visual studio에서는 이를 보완하고자 새로 만든 명령어가 csanf_s()함수 입니다.
함수가 입력값의 크기를 지정한다는 것 외에 다른점은 없습니다.

다만, 환경의 따라 사용할때 여러가지 에러 문구를 확인 할 수 있습니다.

우선 예시 코드를 보자면

#include <stdio.h>

int main(void) {
	char str[256];
    scanf_s("%s", str, sizeof(str)); // 여기서 C6328 에러가 발생합니다.
    printf("%s\n", str);
    return 0;
    }

위의 표시된 C6328 는 scanf_s()함수 내에 sizeof()함수에서 연산자로 알아낸 변수 크기에 해당하는 값의 형태(unsigned_int64)가 기대한 것(unsigned int)과 다르다는 뜻입니다.
경고 메세지가 나와도 동작에는 아무런 문제가 없지만, 경고 메세지를 없애고 싶다면 2가지 방법이 있습니다.

  • 첫 번째로, sizeof()함수 옆에 (unsigned int)를 붙여주면 사라집니다.

예시 코드

#include <stdio.h>

int main(void) {
	char str[256];
    scanf_s("%s", str, (unsigned int) sizeof(str));
    printf("%s\n", str);
    return 0;
    }
  • 두 번째로, sizeof()함수 대신 변수 옆에 대괄호 안에 넣어준 숫자를 그대로 넣어주는 방법 입니다.
#include <stdio.h>

int main(void) {
	char str[256];
    scanf_s("%s", str, 256);
    printf("%s\n", str);
    return 0;
    }
  • 추가적으로 Linux, mac에서는 scanf_s()함수가 없습니다.
    이식성(어떤 코드를 수정 없이 다른 운영 체제에서 컴파일할 수 있는 것)에서 문제가 생깁니다.

s 계열 함수들을 쓰라는 경고를 너무 곧이곧대로 듣지 않는 게 좋습니다. scanf() 함수에 문제가 있는 건 사실이지만 그건 %s와 %c를 쓸 때만 그렇습니다.

[출처 : https://www.clien.net/service/board/kin/5592554]

profile
ENTJ-A

0개의 댓글