메뉴 건너뛰기

scanf_s vs scanf

okchoi 2021.10.23 23:24 조회 수 : 15

1. 실습과제4에 5번문제에서 scanf 를 사용하셨는데 scanf_s를 사용해도 되는건가요?

==> scanf_s()를 사용해서 코드 작성하셔도 됩니다.

 

 

2. 보안상 scanf_s를 사용한다고 강의 중에 말씀하셨는데 scanf, scanf_s를 써야하는 특정한 경우가 있는 것인지요?

차이점은 다음과 같습니다.

scanf_s()의 경우 문자와 문자열을 입력받을 경우에 인수값을 하나 더 입력해서 해당 크기를 넣어줘야 합니다. 

 

char bloodtype;
   scanf_s("%c", &bloodtype, sizeof(bloodtype));

 

char subway[20];
   scanf_s("%s", subway, sizeof(subway));

 

scanf() 함수는 별도로 크기를 지정해 주지 않기 때문에 지정된 버퍼의 크기보다 더 많은 양의 값을 입력할 수 있기 때문에 버퍼 오버플로우에 대해서 많이 취약한 단점이 있었습니다.

(버퍼 오버플로우(Buffer Overflow) = 입력값의 크기가 버퍼 사이즈보다 커서 입력값을 버퍼에 다 담지 못할 때 문제가 되는 취약점)

 

따라서 scanf() 함수의 이러한 보안상 문제점을 해결하기 위해 만든 함수가 scanf_s() 입니다.

 

Dev C++의 경우 scanf() 함수를 사용해도 에러를 발생시키지 않지만 Visual Studio의 경우 다음과 같은 에러를 발생시키면서 scanf_s() 사용을 권장하기도 합니다.

 

오류 C4996

'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

 

3. Dev C++에서  [warning] implicit declaration of function 'scanf_s' 에 대한 해결책

 

implicit declaration of fucntion(함수의 묵시적 선언)은 직접 만든 함수를 사용할때 그 함수를 선언하지 않았을때 발생합니다. scanf_s 함수는 Visual Studio에만 존재하는 비표준 함수이기 때문에 표준 라이브러리에 존재하지 않고, gcc기반의 다른 컴파일러나 IDC(VSC, Dev C++등)에선 작동하지 않습니다.

일단 scanf_s를 사용해서 사용자로 부터 값을 입력받는 것이 보안상 안전한 방법입니다.

그런데 아직까지 위 방법은 visual studio에만 존재하는 비표준 함수 이기 때문에

gcc 기반의 다른 컴파일러나 저희가 사용하는 Dev C++에선 실행은 되지만 warning을 발생시킵니다.

프로그래밍이라는 것이 참 복잡하고 해결해야 할 문제가 많지요?

 

해결책은 scanf_s=> scnaf 로 변경해야 합니다.

하지만 현업에 가서는 scanf_s를 사용해서 수행해야 하기에 저희는 현재 추세에 맞게 scanf_s를 배운 것입니다.

 

4. Scanf에서 & 사용

c언어를 시작하면 printf에서는 &를 안썼는데, scanf에서는 &를 쓸때도 있고, 안쓸때도있습니다.

이 부분이 많이 헷갈리실 것입니다. 

 

변수앞에 &을 붙여 주는 이유는 해당 변수의 주소를 받기 위해서입니다.

(즉, 값을 입력하려면 변수의 주소가 필요하기 때문에 &를 사용해야 합니다.)

 

만약에 a라는 정수형 변수에 10이라는 값이 저장되어 있다면

출력문에서 해당 변수값을 가져와서 그대로 출력을 해 주면 됩니다.

 

int a=20;

printf("a의 값 = %d\n",a);

 

그러나 입력문에서는 값을 메모리(버퍼)에 저장하게 되는데 여기서 scanf() 함수에 포함된 '&'기호를 주소 연산자(&)라고 합니다.

 

즉 사용자가 입력할 값을 해당 주소에 저장하라는 신호를 보내는 것입니다.

그런데 문자열에서는 "&" 기호를 사용하지 않는데 그것은 문자열 자체에 주소를 포함하고 있기 때문입니다.

 

int a;
char b[20];
scanf("%d", &a); //&를 써야한다.
scanf("%s", b); //&를 안써도 된다. b 자체가 주소
번호 제목 글쓴이 날짜 조회 수
공지 메인 함수가 2개 라는 에러메시지 발생했을 때 해결 방법 okchoi 2022.05.30 26
공지 [warning] implicit declaration of function 'scanf_s' 해결책 okchoi 2022.05.24 25
공지 main' must return 'int' 오류에 대한 해결방법 okchoi 2022.05.02 997
공지 main 함수 관련 문의 okchoi 2022.05.02 13
공지 Dev C++ 테마파일 적용시키기 okchoi 2022.04.19 58
공지 연산자 나머지(%%) 표현 방법 okchoi 2022.04.11 211
공지 실행파일 사라지는 현상 okchoi 2022.04.10 8
공지 새로운 프로젝트 생성 방법 okchoi 2022.04.04 8
공지 main 함수 앞에 int, 마무리 할 때 return 0;은 무조건 써야 하는 건가요? okchoi 2022.03.22 348
공지 기말고사 Q/A 모음 okchoi 2021.12.03 22
공지 [Error] 'for' loop initial declarations are only allowed in C99 or C11 mode 해결방법 okchoi 2021.11.22 47
» scanf_s vs scanf okchoi 2021.10.23 15
공지 압축상태에서 프로젝트 파일 클릭시 일어나는 현상 okchoi 2021.09.24 7
공지 파일 확장명 표시하는 방법 okchoi 2021.09.12 75
공지 (C/C++)맥북에서 C언어,C++ 개발 환경 세팅하기 okchoi 2021.09.04 16
공지 Layout 파일 okchoi 2021.07.31 12
공지 Dev C++ 언어 한글(Korean) 설정 okchoi 2021.03.08 2280
공지 void main() 사용시 오류 okchoi 2020.10.24 290
공지 변수 선언 방법 okchoi 2020.07.09 8
공지 Id returned 1 exit status 오류 해결 방법 okchoi 2020.04.20 10648
32 산술연산자 나눗셈 사용법에 대해서 질문 드립니다. okchoi 2020.04.30 601
31 macOS Xcode 오류 okchoi 2021.10.18 307
30 질문있습니다. (scanf() 사용시 개행문자를 넣지 않는 이유) okchoi 2020.04.18 285
29 Dev C++에서 헤더파일 추가하는 방법 okchoi 2020.10.05 138
28 C언어 과제 제출 방법(첫번째 과제) okchoi 2021.10.03 54
27 scanf_s 사용시 공백까지 포함해서 문자열을 입력받고 싶을 경우 file okchoi 2020.04.19 42
26 [warning] implicit declaration of function 'scanf_s' 해결책 okchoi 2020.06.12 37
25 전처리기 지시자의 의미 okchoi 2020.06.12 30
24 scanf에서 &의 역할 okchoi 2020.06.30 29
23 UNIX, Linux 및 Windows의 표준 데이터 유형 okchoi 2022.04.03 26
위로