본문 바로가기
IT/C and C++

[C] scanf 함수를 알아보자!

by 타이모리 2023. 1. 2.

주말에는 할게 많아서 포스팅을 하지 않았습니다. 죄송합니다.

다시 돌아와서 제가 쓴 글들을 보니까 scanf함수를 소개해드린 적이 없더라구요?

그래서 이번에는 scanf 함수를 알아보도록 하겠습니다.

목차


scanf 함수

문자열을 입력받는 함수로, printf랑 쌍으로 묶여서 기본적으로 쓰이는 입출력 함수입니다.

printf 함수에 관한 내용이 궁금하시면 아래의 포스팅을 읽어주세요!

2022.12.29 - [IT/C and C++] - [C] printf 함수를 알아보자!

 

[C] printf 함수를 알아보자!

저번에는 Hello, World 소스 코드를 분석해보았습니다. 이번에는 소스 코드에 있었던 printf 함수를 좀 더 분석해보도록 하겠습니다. 목차 printf 함수 문자열을 출력하는 아주 기본적인 함수입니다.

timemory.tistory.com

printf와 마찬가지로 '스캔에프'로 읽는 경우가 많습니다. (그냥 그렇다구요...)

아래의 표를 보시면 아시겠지만 printf 함수와 마찬가지로 stdio.h 헤더에 존재하는 함수입니다.

(이제 다들 C언어 다루실 때는 #include <stdio.h> 정도는 하시죠? 저는 습관적으로 stdio 함수는 include로 포함하고 시작합니다.)

 

함수 printf(const char* Format, ...);
포함 헤더 파일 stdio.h
의미 console에 입력된 값을 받는다.
응용 서식자를 이용하여 받는 값의 자료형을 지정할 수 있다.
예시 scanf("%d", &a);
scanf("%d %s", &num, str);

이 함수를 통해서 이제 원시 코드에서 직접 값을 바꾸지 않고 프로그램에서 값을 바꾸도록 할 수 있습니다.

결과적으로, 평소 쓰는 프로그램처럼 입출력을 모두 구현한 프로그램을 제작할 수 있습니다.

 

 

 

scanf의 사용법?


scanf("받고자 하는 서식자와 서식", 값을 받을 변수의 포인터 주소, ...);

형식이 printf에 비해서는 약간 어려워 보인다. 특히 저 '포인터'라는 개념은 확실히 C/C++에서 가장 어려운 개념 중 하나로 꼽힐 정도로 어려운 수준입니다.

당장에는 그냥 변수 앞에 & 기호를 붙이는 것으로 이해하도록 합시다. (추후 기본 개념들을 다 포스팅하고 포스팅하도록 하겠습니다.)

다음과 같은 예시를 들 수 있겠습니다.

int a;
scanf("%d", &a);
printf("%d", a);

위의 프로그램은 정수를 입력받아 정수형 변수 a에 대입하는 코드입니다.

이후, a의 값을 printf 함수를 통해 출력하는 코드입니다.

 

서식자


printf에서 쓰이는 서식자가 그대로 적용됩니다. 아주 약간 다른 점이 있으나 별 차이가 없으니 printf 편에서 다 학습했었다면, 그리 신경쓰지 않고 넘기셔도 됩니다.

서식자는 %(문자)로 이루어져 있습니다. 다음의 표를 보시면 종류와 의미를 아실 수 있습니다.

서식자 의미 비고 출력 예시
%d 정수 입력   12
%f, %lf 실수 입력 입력에는 float, double의 차이가 있다. 12.34
%c 문자 입력 문자 1개 입력 A
%s 문자열 입력 문자 여러 개 입력 ABC
%x 16진수 입력 16진수는 0~F로 이루어짐 FF (10진수로 255)
%o 8진수 입력 8진수는 0~7로 이루어짐 77 (10진수로 63)

서식자를 활용하는 방식은 다음과 같습니다.

scanf("%f", &a)

이렇게 구성하면 float 형태로 값을 받아들입니다.

위에서 적지 않았는데, scanf는 Enter를 눌러야 값이 전달됩니다.

(이 특징을 이용해서 Enter를 누를 때 까지 프로그램을 유보하는 방식으로도 쓸 수 있습니다.)

 

참고로 printf의 서식자를 배워오셨다면 %u, %e와 같은 서식자가 사라졌다는 것을 알 수 있습니다.

이는 서식자가 저 형식이 아니여도 잘 입력을 받기 때문입니다.

위의 scanf 함수 예제에서 입력을

12.000e+03

과 같이 입력해도, 12000이 잘 입력됨을 확인할 수 있습니다.

 

scanf("%s", str);

이상한 점을 느끼셨나요? 원래는 str앞에 &가 붙어있어야 할 것 같습니다.

그러나, 붙어있지 않은 것을 알 수 있는데, %s로 문자열을 입력받을 때는

무조건 변수가 배열(후에 배우게 될 개념입니다. 지금은 그냥 그렇다고만 알아주세요)인데, 이 경우 이미 포인터형 변수로 입력되기 때문에, & 연산자를 적용하지 않아도 됩니다.

(오히려 쓰면 에러나요.)

 

scanf 함수의 문자열 내에 다른 값을 썼을 때


scanf 함수의 문자열에 다른 값을 쓰게 되면, 그 문자열에 맞추어 입력이 이루어져야 합니다.

상상이 안되시면 아래의 예시를 이해해보세요!

int a = 0;
scanf("value:%d", &a);

이렇게 생긴 함수의 경우

입력이 value:(정수) 의 형태로 이루어져야 합니다.

이 형식이 아니면 변수 a에 입력이 알맞게 이루어지지 않습니다.

 

(참고 : 정확한 규칙에 대해서는 찾지 못했습니다. 보니까, 서식자의 앞쪽 문자열만 알맞게 입력되면 값을 잘 전달하는 것 같은데.. 어떤 원리인지는 후에 추가 포스팅해보도록 하겠습니다.

 

특수한 형식의 입력에서 원하는 값만 찾아 입력받고 싶을 때, 쓰일 수 있을 것 같습니다.

(그러나, 하나도 쓰이지 않는다는 슬픈 현실..)

 

마무리

이번 포스팅은 printf 함수를 배우면 같이 묶여서 입출력의 기본 함수 한 세트로 알려진 scanf 함수를 배웠습니다.

이 scanf 함수도 printf 함수 못지 않게 자주 쓰입니다.

console에서 값을 입력받을 수 있게 되었으니, 앞으로 쓸 수 있는 예제의 범위가 확 늘어나게 되겠군요.

다시한 번 주의드리는 것은 scanf에서 입력받을 변수 앞에 &를 붙어야 하고, %s 서식자를 이용해서 문자열 데이터를 입력받을 때는 입력받을 변수의 앞에는 &를 붙이지 않는다는 것을 알아두면 좋습니다.

 

다음에는 배열에 관하여 포스팅하게 되겠네요.

그럼, 다음 포스팅에서 뵙시다!

댓글