본문 바로가기
Language_/C 언어

[c언어] scanf와 scanf_s의 차이

by 낭람_ 2018. 10. 10.
반응형

[scanf와 scanf_s의 차이]


기존에 사용하던 scanf함수는 지정된 버퍼의 크기보다 더 많은 양의 문자를 넣을수 있기 때문에 버퍼오버플로우에 대해서 많이 취약했다.

이러한 부분을 보완하고자 만든 함수가 scanf_s이다. _ 즉, 보안을 위해서 보완한 함수이다.


scanf와 scanf_s의 사용법은 거의 똑같지만, 문자와, 문자열을 입력받을 경우에 인자값으로 하나를 더 입력해 줘야한다.


#include<stdio.h>

int main() {
char arr[20];
scanf("%s",arr);
}


- scanf 함수는 arr 크기가 20일때 arr에 20이상의 문자를 넣을수 있다는 취약점(버퍼오버플로우)이 있었다.


#include<stdio.h>

int main() {
char arr[20];
scanf_s("%s",arr,sizeof(arr));
}


- scanf_s 함수는 문자열의 크기를 인자값으로 넘겨주어 arr 크기가 20일때 arr에 19개의 문자열을 입력할 수 있게 되었다. (1개는 \0을 넣을 공간)

- 그리고 버퍼의 크기를 주지 않으면, 출력이 되지 않는다.


#include<stdio.h>

int main() {
char arr[20];
char str[20];
scanf_s("%s %s",arr,sizeof(arr),str,sizeof(str));
}


- 만약 문자열을 두개 이상 입력 받고싶으면 위의 코드처럼 배열_1 이름, 배열_1 크기, 배열_2 이름, 배열_2 크기 순으로 넣어주면 된다.


[Visual Studio 2017 scanf 오류 해결하기]

반응형

'Language_ > C 언어' 카테고리의 다른 글

[c언어] memset 함수에 대하여  (0) 2018.11.24
[c언어] ctype.h 함수 목록  (0) 2018.10.31
[c언어] Visual Studio 콘솔창 유지  (0) 2018.10.06
[c언어] Visual Studio 2017 설치하기  (0) 2018.10.05
[c언어] c언어란?  (0) 2018.10.05

댓글