본문 바로가기
PL (Programming Language)/C

[C] scanf 로 공백 포함 입력받기, scanf_s 보안경고 해결하기

by jangThang 2023. 4. 19.
반응형

 C언어에서는 scanf 함수로 사용자로부터 값을 입력받습니다. 이 함수의 사용법 및 예시를 알아봅니다.

 

[ Contents ]

     

     

    1. scanf

    scanf(출력형식, &변수);

     

     scanf는 사용자로부터 값을 입력받는 함수입니다. 출력형식으로 어떻게 값을 입력을 받을지 설정하고, 변수에 값을 대입합니다. 여기서 &변수임을 주의해야 합니다. 변수명이 아니라, 변수의 주소가 들어갑니다. (&는 변수의 주소를 반환하는 주소연산자)

     

    int i;
    scanf("%d", &i);

     위 코드는 정수형 변수 i에 사용자 값을 입력받는 코드입니다.

     

    int i;
        char str[10];
        scanf("%d %s", &i, str);
        
        printf("%d %s", i, str);

     

     위와 같이 한 번에 여러 개의 데이터를 입력받을 수도 있습니다.

     배열은 변수명 자체가 '배열 주소'를 내포하고 있기 때문에, 굳이 &를 할 필요가 없습니다.

     (배열은 배열의 첫번째 항목 주소를 가르킴) 

     

     

     

    2. 공백을 포함하여 입력받기

    scanf("%[^\n]s", str);

     

     scanf함수는 공백을 기준으로 나누어서 입력받습니다. 그래서 scanf("%d %s", &i, str) 가 가능했죠.

     하지만 문자열의 경우에는 공백까지 포함해서 입력 받아야할 수 있습니다. 그럴 때에는 [^\n]을 포함하면 됩니다.

     

    char str[20];
    scanf("%[^\n]s", str);
        
    printf("%s", str);

     

     

     

    3. scanf_s

     scanf에 secure의 약자인 s를 덧붙인 함수입니다.

     scanf는 일단 입력한 그대로 받기 때문에, 변수의 크기보다 큰 경우인 '오버플로우'가 많이 발생했습니다. 그래서 scanf_s함수가 나왔으며, scanf_s는 문자형을 입력받을 때 사이즈 크기도 인자로 입력해야 합니다.

     

     scanf_s( "%s", str, sizeof(str) );

     

     scanf_s는 세번째 인자 크기만큼만 문자열을 받습니다.

     

     

    cf) 에디터 오류

    #define _CRT_SECURE_NO_WARNINGS

     간혹 마이크로소프트 비주얼 스튜디오처럼 깐깐한 에디터에서는 scanf_s를 사용하지 않는다고 오류를 낼 수도 있습니다. 그럴 때에는 include문 밑에 위 코드를 추가해서 해결할 수 있습니다.

     

     

    star가 되고나서 Tistory

    반응형

    댓글