Clang

[c언어] scanf() 에러/scanf_s() 사용법 (+ 리턴 값)

TaeSeok_Yang 2020. 9. 10. 11:11

비주얼 스튜디오에서 scanf() 함수를 쓸려고 하면 에러가 발생한다.

그 이유는 입력받는 크기에 제한이 없어 버퍼 오버플로우가 발생할 수 있었다.

때문에 scanf_s()를 사용하야 입력받을 크기를 지정해야 한다.

 

간단한 예시로 사용법을 알아보자.

 

정수 입력

#include<stdio.h> 
int main(void) { 
    int a=0; 
    int r = 0;


    r=scanf_s("%d", &a, sizeof(a));  //sizeof(a) == 4
    printf("%d %d", r, a);


    return 0; 
}

 

입력 : 123

출력 : 1 123 

 

scanf()와 비슷하지만 마지막에 입력받을 크기를 지정해 주고 있다.

int형 변수이므로 4를 입력하면 된다.

 

scanf()와 scanf_s()는 입력 버퍼에서 입력에 성공한 횟수를 반환한다.

때문에 변수 r은 1

 

만약 문자열이 들어온다면 읽어 들이지 않고 0을 반환한다.

 

문자열 입력

#include<stdio.h>
int main(void) {
    char a[5]="";
    int r = 0;


    r=scanf_s("%s", a, sizeof(a));  //sizeof(a) == 5
    printf("%d %s", r, a);


    return 0;
}

 

입력 : abcd

출력 : 1 abcd

 

주의할 점은 버퍼의 크기는 5바이트이지만 문자열은 종료 문자가 들어가야 하므로 4바이트만 사용 가능하다.

 

여러 개 입력

#include<stdio.h> 
int main(void) { 
    char a[5]=""; 

    char b[5]=""; 

    char c[5]=""; 
    int r = 0;


    r=scanf_s("%s %s %s", a, sizeof(a), b, sizeof(b), c, sizeof(c));
    printf("%d %s %s %s", r, a, b, c);


    return 0; 
}

 

만약 입력이 'a b c' 이라면 r은 3이지만

'a b cccccccc' 라면 마지막은 읽어 들이지 않으므로 r은 2이며

'aaaaaaaaa b c'라면 앞에서 읽어 들이지 못했기 때문에 뒤에 b와 c도

읽어 들이지 못하여 r은 0이 된다.