입출력 (printf/scanf)
지난 편에서는 산술, 관계, 논리, 비트 연산자를 배웠습니다. 이번에는 프로그램이 화면에 결과를 출력하고, 사용자로부터 값을 입력받는 방법을 알아보겠습니다. 지금까지는 printf로 결과만 출력해봤는데, 오늘은 서식 지정자를 좀 더 제대로 살펴보고 scanf로 입력을 받는 방법까지 정리해보겠습니다. 입출력을 다룰 줄 알아야 비로소 “사용자와 대화하는” 프로그램을 만들 수 있습니다.
printf, 화면에 출력하기
printf는 “print formatted”의 줄임말로, 정해진 서식(format)에 맞춰 문자열을 화면에 출력하는 함수입니다. 서식 문자열 안에 %d, %f처럼 퍼센트 기호로 시작하는 서식 지정자를 넣으면, 그 자리에 뒤에 나열한 변수 값이 순서대로 채워집니다.
자주 쓰는 서식 지정자는 다음과 같습니다.
%d: 정수(int)%f: 실수(float, double) — 기본적으로 소수점 6자리까지 출력%c: 문자(char)%s: 문자열%.2f: 소수점 2자리까지만 출력하고 싶을 때
int age = 25;
double height = 175.5;
char grade = 'A';
printf("나이: %d살\n", age);
printf("키: %.1fcm\n", height);
printf("학점: %c\n", grade);
\n은 줄바꿈 문자로, 이걸 빼먹으면 출력이 한 줄에 계속 이어 붙어서 나오니 꼭 챙겨줘야 합니다.
scanf, 키보드로 입력받기
scanf는 반대로 사용자가 키보드로 입력한 값을 변수에 저장하는 함수입니다. 여기서 가장 헷갈리는 부분이 바로 변수 앞에 &(주소 연산자)를 붙여야 한다는 점입니다. scanf는 값을 “저장”해야 하므로, 변수 자체가 아니라 그 변수가 있는 메모리 주소를 알려줘야 하기 때문입니다.
int number;
printf("숫자를 입력하세요: ");
scanf("%d", &number);
printf("입력한 숫자는 %d입니다.\n", number);
문자열을 입력받을 때는 %s를 쓰는데, 이때는 배열 이름 자체가 이미 주소를 의미하므로 &를 붙이지 않습니다.
char name[20];
printf("이름을 입력하세요: ");
scanf("%s", name);
단, %s로 입력받으면 공백을 만나는 순간 입력이 끊긴다는 점을 주의해야 합니다. “홍길동”처럼 한 단어는 괜찮지만 “홍 길동”처럼 띄어쓰기가 있으면 “홍”까지만 저장됩니다. 이 문제는 나중에 문자열을 다루는 편에서 더 자세히 살펴보겠습니다.
예제 코드로 확인해보기
간단한 학생 정보 입력 프로그램을 만들어 보겠습니다.
#include <stdio.h>
int main(void) {
char name[20];
int age;
double score;
printf("이름을 입력하세요: ");
scanf("%s", name);
printf("나이를 입력하세요: ");
scanf("%d", &age);
printf("점수를 입력하세요: ");
scanf("%lf", &score);
printf("\n--- 입력한 정보 ---\n");
printf("이름: %s\n", name);
printf("나이: %d살\n", age);
printf("점수: %.1f점\n", score);
return 0;
}
코드 동작 설명 및 실행 결과
char name[20]은 최대 19글자(+널문자 1개)까지 저장할 수 있는 문자열 공간입니다. 배열은 뒤에서 자세히 다루지만, 지금은 “이름을 담을 상자”라고 생각하면 됩니다.scanf("%lf", &score)처럼double을 입력받을 때는%f가 아니라%lf를 써야 합니다. 반면printf로double을 출력할 때는%f만 써도 됩니다. 이 부분은 실수하기 쉬우니 꼭 기억해두세요.- 이 코드를
gcc io_basics.c -o io_basics로 컴파일하고 실행한 뒤, “철수”, “21”, “88.5”를 차례로 입력하면 다음과 같은 결과가 나옵니다.
이름을 입력하세요: 철수
나이를 입력하세요: 21
점수를 입력하세요: 88.5
--- 입력한 정보 ---
이름: 철수
나이: 21살
점수: 88.5점
핵심 요약
printf는 서식 지정자(%d,%f,%c,%s등)를 이용해 값을 화면에 출력합니다.scanf로 입력받을 때는 일반 변수 앞에&(주소 연산자)를 붙여야 하지만, 배열(문자열)은 이름만 써도 됩니다.double값을scanf로 입력받을 때는%f가 아니라%lf를 사용해야 합니다.%s로 문자열을 입력받으면 공백에서 입력이 끊기니 주의해야 합니다.
다음 편에서는 프로그램의 흐름을 조건에 따라 다르게 만드는 “조건문 (if/switch)”에 대해 알아보겠습니다. 오늘 배운 관계·논리 연산자와 입출력 함수를 활용해서, 사용자의 입력값에 따라 다른 동작을 하는 프로그램을 만들어보겠습니다.