C언어

10-2) 표준입력함수 - scanf

SleeveStar 2021. 3. 3. 23:50
반응형

만능 표준입력 함수 scanf

 

표준 입력 함수인 scanf는 scan format을 줄인 이름이다 getchar 함수는 하나의 문자를 입력받는 함수이고 gets 함수는 문자열을 입력받는 함수이다.

 

그런데 이 scanf 함수는 다양한 키워드를 사용하여 문자, 문자열 뿐만아니라 정수, 실수까지 모두 입력 받을 수 있도록 형식화된 입력을 제공한다. 형식화된 입력이란 자신이 입력 받을 데이터의 종류, 자릿수, 입력형식 같은 것을 지정할 수 있다는 뜻이다.

 

키워드

키워드 %d %hd %f %lf %c %s
입력형식 정수(Int) 정수(short int) 실수(float) 실수(double) 문자 문자열

scanf 함수를 사용하는 기본 형태는 다음과 같다.

 

int data;

scanf("%d",&data);

 

%d = 입력 형식 지정 키워드, &data = 입력 받은 값을 저장할 변수의 주소

 

scanf 함수를 사용하여 정수와 실수 값 입력 받기

 

scanf 함수에서 &연산자를 사용하는 이유

 

getchar 함수는 한 번에 한개의 값을 입력받는다. 따라서 함수 안에서 입력 받은 값을 return문으로 반환하여 변수에 저장한 후 사용할 수 있다. 반면에 scanf 함수는 한번의 함수 호출로 여러개의 값을 입력 받을 수 있도록 만들어졌기 때문에 포인터가 꼭 필요하다.

 

*scanf는 포인터 기술을 사용하여 값을 반환한다.

 

예제

 

int num1, num2;

scanf("%d %d", &num1, &num2);

 

scanf 함수에서 입력된 값을 구분하는 방법

Enter 키를 사용하여 구분하기 공백을 사용하여 구분하기
5 Enter 5 3 Enter
3 Enter  

그리고 이 함수는 특별한 값 없이 Enter 키나 공백 문자가 여러 개 입력되면 그 입력은 무시해버리고 실제 정보를 기준으로 입력을 받아들인다. 따라서 다음과 같이 입력하더라도 num1에는 정수 값 5가 입력되고 num2에는 정수 값 3이 입력된다.

 

scanf 함수로 문자열을 입력 받을 때 주의할 점

 

scanf 함수가 Enter 키와 공백 문자를 사용하여 입력을 구분하다 보니 문자열을 입력할 때 중간에 공백이 들어가면 자신이 원하는 문자열을 다 입력 받지 못하는 문제가 발생하기도 한다.

 

scanf 함수를 사용하여 문자열 입력 받기

 

위와 같은 예제에서는 입력하는 문자열에 공백이 포함된다면 scanf 대신에 gets 함수를 사용하는 것이 더 좋다.

 

 

 

공백 문자로 구분해서 여러 개의 정보 입력 받기 

 

printf 함수처럼 scanf 함수도 정수를 사용할때 8진법(%o), 10진법(%d), 16진법(%x)을 구별해서 사용할 수 있다.

소스 코드에서는 진법을 사용할 때 8진수 앞에 0을 붙이고 16진수 앞에 0x를 붙여서 사용하지만 사용자가 키보드로 입력 할 때는 0이나 0x를 붙여서는 안된다.

 

공백 문자로 구분해서 scanf 함수로 8, 10, 16진수 입력 받기

 

scanf 함수는 입력 형식 키워드와 자료형이 일치해야 한다.

 

printf 함수는 변수의 값을 전달 받아 사용자가 지정한 형식에 맞게 출력하는 방식으로 구성된 함수이다. 따라서 정수를 받는 %d 키워드를 사용하면 변수의 자료형과 상관없이 10진수로 변수의 값을 출력한다. 하지만 scanf 함수는 &연산자를 사용하여 변수의 주소를 전달 받는 방식이기 때문에 %d 키워드를 사용하면 반드시 정수 자료형인 int령 변수를 사용해야 한다.

 

char data1 = 5;

short data2 = 6;

int data3 = 7;

printf("%d %d %d", data1, data2, data3);  //화면에 정상적으로 5 6 7이 출력됨

scanf("%d %d %d", &data1, &data2, &data3);  //실행할 때 문제가 발생함 - 입력키워드와 자료형이 다르다

 

*scanf 함수는 포인터를 사용하기 때문에 형식을 지정하는 키워드와 변수의 자료형이 맞지 않으면 프로그램에 오류가 발생할 수 있다.

 

입력 형식 키워드 변수 자료형
%c char, unsigned char
%o %d %x int, unsigned int
%f float
%lf double
%s char *, char[]

scanf 함수를 사용하여 나이 입력 받기(1)

 

앞의 코드는 정상으로 보이지만 사실 치명적인 오류를 포함하고있다. 만약 사용자가 실수로 나이에 "abc"라고 입력한다면 "나이가 잘못되었습니다."라는 메시지를 무한으로 반복하여 출력한다.

 

이러한 현상이 발생하는 이유는 %d 를 사용했는데 정수 형태의 숫자 패턴이 입력되지 않고 문자열이 입력되었기 때문이다. scanf 함수가 입력을 오류로 처리하면 입력 버퍼에 저장되어 있는 "abc(Enter)"를 그대로 두고 오류 값 0 을 반환한다. 그리고 처리에 실패했기 때문에 인수로 넘긴 num 값이 0으로 유지되어 (num > 0 && num<=130) 조건에 의해 "나이가 잘못되었습니다."가 무한으로 출력되는 것이다.

 

 

scanf 함수를 사용하여 나이 입력 받기(2)

 

만약 위 예제에서 숫자 패턴도 아니고 문자 패턴도 아닌 "123abc"라고 입력했다면 scanf 함수가 실패하지 않고 정상적으로 처리되면서 num 변수에 정수값 123이 입력된다. 하지만 scanf 함수는 자신에게 필요한 123만 이용해서 숫자 값을 처리하기 때문에 사용하지 않은 "abc" 문자열은 입력버퍼에 그대로 남겨둔다 따라서 다음번에 호출되는 표준 입력 함수가 있다면 이 값을 사용하므로 rewind함수를 사용하여 표준 입력 버퍼를 비우는게 좋다.

반응형

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

11-2) 배열 시작 주소  (0) 2021.03.14
11) 배열과 포인터 표기법  (0) 2021.03.05
10) 표준 입력 함수 - getchar, gets  (0) 2021.02.25
9-1) 포인터 변수의 주소 연산  (0) 2021.02.08
9)포인터  (0) 2021.01.30