[c언어] scanf() 에러/scanf_s() 사용법 (+ 리턴 값)
비주얼 스튜디오에서 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이 된다.