OneDev

[C] 9. 입력받기(scanf 함수) 본문

Language/C

[C] 9. 입력받기(scanf 함수)

one_dev 2022. 7. 19. 16:34

이번 포스팅에서는 C 에서 문자 혹은 숫자를 입력받는 방법에 대해 알아보자.

 

기본적으로 C에서 무언가를 입력받을 경우에는 scanf 함수를 이용한다.

 

1. scanf 함수란?

scanf 함수는 C 의 표준 입력 함수로, 다양한 데이터를 서식에 맞춰 입력받을 수 있게 해준다.

scanf 에 관한 기본적인 정보는 아래와 같다.

 

  • 헤더 : stdio.h
  • 원형 : scanf("변환문자", &변수명);

scanf 함수는 우리가 입력을 하기 전까지 계속 기다리며, 엔터를 눌러야지만 입력으로 처리된다.

 

(예)

#include <stdio.h>

int main(){
	int a;
    
    scanf("%d", &a);   // a 라는 정수형 변수를 입력 받는다
    
    return 0;
}

 

2. scanf 함수 사용법

 

위에서도 얘기했지만, 기본적인 틀은 아래와 같다. 

 

 

(1) 변환문자

입력받을 데이터의 형태를 지정해주는 부분이다.

예를 들면 %d 는 정수형 데이터를, %f 는 float 형 데이터를 의미한다.

변환문자에 맞는 데이터형 변수를 넣지 않는다면 보안상 문제가 생길수도 있으니 유의하자.

변환문자에는 다음과 같은 것들이 있다

 

  • %d : int 타입 정수형
  • %c : char 타입 문자형
  • %s : char* 타입 문자열 or char[] 타입 문자열
  • %lf : double 타입 실수 ( LF의 소문자 / if 가 아니다)
  • %f : float 타입 실수

(주의) printf 함수의 경우 double형 변수나 float형 변수 모두 %f 로 출력하는 반면에 scanf 함수는 double형 변수는 %lf 를 통해 입력받아야 한다.

 

즉, float 형 데이터 입력 받을 시 →  %f 사용 / double 형 데이터 입력 받을 시 → %lf 사용 

또한, printf 함수는 모든 정수형 변수가 %d 로 출력 가능하지만, scanf함수는 같은 정수라도 자료형에 맞는 포맷을 사용해주어야 한다.

 

 

(2) 주소연산자(&)

&는 변수의 주소를 타나내는 주소연산자이다.

예를 들어 &a 는 a라는 변수의 주소를 나타낸다.

scanf 함수에서는 변수명 앞에 이 주소연산자를 붙여주어야 한다.

다만 배열을 입력받을 경우는 주소연산자 & 를 붙이지 않는다.

#include <stdio.h>

int main()[
	int a;
    int arr[10];
    
    scanf("%d \n", &a); // int 형 변수 a를 입력받을때는 & 를 붙여준다
    scanf("%s \n", arr) // 배열 arr 을 입력받는 경우엔 붙이지 않는다.
    scanf("%c \n", &arr[2]); // 다만 배열의 특정 원소를 입력받는 경우에는 &을 붙인다.
    
    return 0;
    
}

 

 

(3) 여러가지 데이터 입력받기

scanf 함수는 한번에 여러가지 데이터를 입력받을 수 있다

 

--> 이부분은 차후 추가 예정

 

 

 

 

3.  _CRT_SECURE_NO_WARNINGS 해결법

scanf 함수는 보안에 취약하다. 지정한 타입보다 큰 데이터를 입력받게 되면 버퍼 오버플로 라는 오류가 발생할 수 있기 때문이다.

그렇기 때문에 scanf 함수를 이용할 경우 종종 _CRT_SECURE_NO_WARNINGS 라는 문구와 함께 에러가 뜨는 경우가 있는데, 해결방법은 크게 두가지이다.

 

(1) 소스파일 상단에 #define _CRT_SECURE_NO_WARNINGS 적어주기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
...
...
...

(2) 소스파일 속성에 적어주기

 

사용중인 소스파일 우클릭 -> 속성 클릭

 

 

 

 

C/C++ -> 전처리기 -> 전처리기 정의 우측칸에  _CRT_SECURE_NO_WARNINGS; 입력후 적용

Comments