[C언어][초급] Chapter08. 입력 함수 scanf – 사용자로부터 값 받아오기
코드가 사용자와 소통하는 방법은?
이전까지는 printf를 이용해 화면에 무언가를 출력하는 연습을 해보았습니다. 하지만 프로그램이 실제로 “쓸모” 있으려면, 사용자로부터 정보를 입력받는 기능도 필요합니다.
바로 이때 사용하는 함수가 scanf입니다.
이번 글에서는 scanf의 기본 구조, 다양한 자료형 입력, 그리고 직접 해볼 수 있는 연습 문제까지 정리해보겠습니다.
● scanf란?
scanf는 “scan formatted”, 즉 서식을 지정해서 입력받는 함수입니다.
사용자가 키보드로 입력한 값을 변수에 저장하고, 그 값을 이용해 프로그램을 제어할 수 있게 해줍니다.
#include <stdio.h>
int main(void) {
int num;
printf("숫자를 입력하세요: ");
scanf("%d", &num);
printf("입력한 값은 %d입니다.\n", num);
return 0;
}
- 주의할 점: 변수 앞에 &를 꼭 붙여야 합니다.
- 변수의 **주소(address)**를 넘겨야 값이 저장되기 때문입니다.
● 자료형별 입력 방법
자료형 | 서식 지정자 | 예시 | 설명 |
int | %d | scanf("%d", &a); | 정수 입력 |
float | %f | scanf("%f", &b); | 실수 입력 |
char | %c | scanf(" %c", &ch); | 문자 1개 입력 (공백 주의) |
string | %s | scanf("%s", str); | 문자열 입력 (공백 포함 불가) |
※ 문자열 입력 시 & 안 씁니다. 문자열은 배열 이름 자체가 주소이기 때문입니다.
● 여러 개의 값 한 번에 입력받기
int a, b;
scanf("%d %d", &a, &b);
입력: 10 20 → a: 10, b: 20
● 실습 예제
#include <stdio.h>
int main(void) {
int age;
char name[20];
printf("이름을 입력하세요: ");
scanf("%s", name);
printf("나이를 입력하세요: ");
scanf("%d", &age);
printf("%s님의 나이는 %d살입니다.\n", name, age);
return 0;
}
- scanf("%s", name)은 공백이 포함된 문자열은 입력받지 못합니다. "홍 길동"처럼 띄어쓰기가 있는 이름은 "홍"만 저장됩니다.
실습 문제
아래 문제는 직접 코드를 작성해보고, 실행 결과를 확인한 후 스스로 정답을 유추해보는 형태입니다.
정답은 바로 아래에서 확인할 수 있습니다.
문제 1
정수형 변수 a에 사용자로부터 값을 입력받아 출력하세요.
#include <stdio.h>
int main(void) {
int a;
printf("정수를 입력하세요: ");
scanf("%d", ?);
printf("입력한 값: %d\n", a);
return 0;
}
문제 2
정수형 변수 a, b를 입력받고 두 수의 합을 출력하세요.
int a, b;
scanf("?", ?);
printf("결과: %d\n", a + b);
문제 3
실수형 변수 pi에 값을 입력받고 소수점 둘째 자리까지 출력해보세요.
float pi;
scanf("?", ?);
printf("입력한 값: ?\n", pi);
문제 4
문자형 변수 ch에 문자를 입력받아 출력하세요. 입력 전 공백에 주의하세요.
char ch;
scanf("?", ?);
printf("입력한 문자: %c\n", ch);
문제 5
문자열을 입력받아 출력하는 코드를 완성해보세요. 공백은 포함하지 않는 입력입니다.
char name[20];
scanf("?", ?);
printf("이름: %s\n", name);
문제 6
다음 코드는 10 3.5를 입력받았을 때 어떤 출력이 나올까요?
int a;
float b;
scanf("%d %f", ?);
printf("정수: %d, 실수: %.1f\n", a, b);
문제 7
문자열 "홍 길동"을 입력했을 때 아래 코드의 출력은?
char name[20];
scanf("%s", name);
printf("이름: %s\n", name);
문제 8
다음 중 & 기호를 사용하지 않아도 되는 경우는?
A. 정수형 변수
B. 문자형 변수
C. 실수형 변수
D. 문자열(char 배열)
문제 9
사용자에게 실수를 입력받고 소수점 둘째 자리까지 출력하는 코드로 옳은 것은?
A. scanf("%f", num);
B. scanf("%f", &num); printf("%f", num);
C. scanf("%f", &num); printf("%.2f", num);
D. scanf("%d", &num); printf("%.2f", num);
문제 10
다음 중 올바르지 않은 scanf 사용은?
A. scanf("%d", &a);
B. scanf("%f", &b);
C. scanf("%c", ch);
D. scanf("%s", name);
▶ 정답 확인하기
정답 1
scanf("%d", &a);
정답 2
scanf("%d %d", &a, &b);
정답 3
scanf("%f", &pi);
printf("입력한 값: %.2f\n", pi);
정답 4
scanf(" %c", &ch);
정답 5
scanf("%s", name);
정답 6
scanf("%d %f", &a, &b); → 출력: 정수: 10, 실수: 3.5
정답 7
출력: 이름: 홍 (공백 이후는 저장되지 않음)
정답 8
D. 문자열(char 배열) → 배열 이름은 주소이므로 & 불필요
정답 9
C. scanf("%f", &num); printf("%.2f", num);
정답 10
C. → scanf("%c", &ch);처럼 문자형도 & 필요함