C, C++ 언어

[C언어기초] 5. 입출력문

게임플밍마스터 2025. 7. 3. 11:37

지금까지 우리가 만든 프로그램은 정해진 코드에 따라 움직이는 일방적인 프로그램이었습니다. age 변수에 20을 넣으면 영원히 20살인 프로그램이었죠. 하지만 진짜 쓸모 있는 프로그램은 사용자가 원하는 데이터를 입력하고, 그에 맞춰 다른 결과를 보여줄 수 있어야 합니다.

이번 장에서는 4장에서 잠시 맛보았던 printf 함수의 다양한 사용법을 알아보고, 사용자의 키보드 입력을 프로그램으로 가져오는 scanf 함수에 대해 집중적으로 배우겠습니다. 드디어 여러분의 프로그램이 사용자와 '대화'를 시작합니다.

1. 출력의 달인, printf 다시 보기

printf는 단순히 글자만 출력하는 것이 아니라, 변수에 담긴 값을 원하는 형식에 맞춰 깔끔하게 보여주는 강력한 기능입니다. 이때 사용하는 것이 바로 서식 지정자(Format Specifier) 입니다.

서식 지정자 대응 자료형 의미

%d int 10진수 정수(Decimal) 형식으로 출력
%c char 문자(Character) 하나를 출력
%s 문자열 **문자열(String)**을 출력 (뒤에서 자세히 배움)
%f float, double 실수(Float) 형식으로 출력
%.1f float, double 실수를 소수점 첫째 자리까지 출력

 

printf 함수 하나에 여러 개의 서식 지정자를 사용하여 다양한 변수를 한 번에 출력할 수도 있습니다.

int age = 25;
char name[] = "홍길동"; // 문자열 변수. 지금은 이렇게 쓴다고만 알아두세요!
printf("%s님의 나이는 %d살입니다.\n", name, age);

 

실행 결과:

홍길동님의 나이는 25살입니다.

printf는 순서대로 서식 지정자(%s, %d)를 찾고, 그에 해당하는 변수(name, age)의 값으로 바꿔치기 하여 보여줍니다.

 

2. 사용자의 목소리를 듣다, scanf

printf가 프로그램의 말을 밖으로 전하는 '스피커'라면, **scanf**는 사용자의 목소리를 안으로 듣는 '마이크'와 같습니다. 사용자가 키보드로 입력한 값을 변수에 저장해주는 역할을 합니다.

scanf의 기본 문법은 다음과 같습니다.

scanf("서식지정자", &변수이름);
  • 서식지정자 : printf와 마찬가지로, 사용자로부터 어떤 형식의 데이터를 입력받을지 알려줍니다. 정수를 원하면 %d, 실수를 원하면 %f를 사용합니다.
  • &변수이름: 여기가 가장 중요합니다. & 기호는 변수의 '메모리 주소' 를 의미합니다. 
  • 위와 같이 사용시 ‘scanf’: This function or variable may be unsafe 라는 오류가 나옵니다. 이러 경우 scanf_s 를 사용하던가 파일 맨위에 #define *CRT_SECURE_NO_WARNINGS 라고 넣어 줍니다.*

&는 왜 필요할까요?

printf는 변수 상자 안에 든 값만 알면 그것을 화면에 보여줄 수 있습니다. 하지만 scanf는 사용자가 입력한 값을 변수 상자 안에 넣어줘야 합니다. 값을 넣으려면 그 상자가 어디에 있는지 주소를 알아야 찾아갈 수 있겠죠? &가 바로 그 집 주소를 알려주는 '주소 연산자'입니다.

(이 개념은 나중에 '포인터'에서 더 깊이 다루게 되니, 지금은 "scanf를 쓸 때는 변수 이름 앞에 &를 붙인다!" 라고 규칙처럼 기억해 주세요.)

 

3. [직접 해봐요!] scanf로 만드는 대화형 프로그램

사용자에게 나이를 물어보고, 입력받은 나이를 다시 출력해주는 간단한 대화형 프로그램을 만들어 봅시다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int user_age; // 사용자의 나이를 저장할 변수 선언

    printf("당신의 나이는 몇 살인가요? "); // 사용자에게 질문을 던짐
    scanf("%d", &user_age); // 키보드로 정수를 입력받아 user_age 변수에 저장

    printf("아! 당신의 나이는 %d살이군요.\n", user_age); // 입력받은 값을 확인시켜 줌

    return 0;
}

 

실행 과정:

  1. 프로그램을 실행하면 당신의 나이는 몇 살인가요? 라는 메시지가 출력되고, 커서가 깜박이며 입력을 기다립니다.
  2. 여기에 숫자 30을 입력하고 Enter 키를 칩니다.
  3. scanf 함수는 입력된 30을 user_age 변수의 주소에 찾아가 저장합니다.
  4. 마지막 printf 함수가 user_age 변수에 저장된 값 30을 읽어와 최종 메시지를 출력합니다.

실행 결과 예시:

당신의 나이는 몇 살인가요? 30
아! 당신의 나이는 30살이군요.

 

4. scanf 사용 시 주의할 점 (정말 중요해요!)

scanf는 편리하지만, 초보자를 괴롭히는 작은 함정이 하나 있습니다. 바로 '입력 버퍼(Input Buffer)'와 관련된 문제입니다.

우리가 키보드로 30을 입력하고 Enter를 치면, 입력 버퍼라는 임시 공간에 30과 줄바꿈 문자 \n이 함께 들어갑니다. scanf("%d", ...)는 숫자 30만 쏙 가져가고, 버퍼에는 \n이 그대로 남아있게 됩니다.

이후에 또 다른 scanf로 문자를 입력 받으려고 하면, 이 남아있던 \n을 입력으로 오해해서 의도치 않은 결과가 발생할 수 있습니다.

 

문제 상황 예시:

int num;
char ch;

printf("숫자를 입력하세요: ");
scanf("%d", &num); // 사용자가 10 + Enter 입력. 10은 num에, \n은 버퍼에 남음

printf("문자를 입력하세요: ");
scanf("%c", &ch); // 버퍼에 남아있던 \n을 읽어버려서 입력을 기다리지 않고 통과함

printf("입력한 숫자: %d, 문자: %c\n", num, ch);

간단한 해결책:

이 문제를 해결하는 가장 간단한 방법은, scanf의 서식 지정자 앞에 공백을 한 칸 넣어주는 것입니다. 이 공백은 scanf에게 "이전에 남아있던 공백이나 줄바꿈 문자는 모두 무시해라"고 알려주는 역할을 합니다.

// ...
printf("문자를 입력하세요: ");
scanf(" %c", &ch); // %c 앞에 공백 하나! 이것이 버퍼에 남은 \n을 지워줍니다.
// ...

 

5. [도전! 프로그래밍] 나만의 BMI 계산기

이제 배운 내용을 모두 활용하여 실용적인 프로그램을 만들어 봅시다. 사용자에게 이름, 키(cm), 몸무게(kg)를 입력받아 체질량지수(BMI)를 계산하고 출력하는 프로그램입니다.

  • BMI 계산 공식: 몸무게(kg) / (키(m) * 키(m))
  • 주의: 키는 cm로 입력받지만, 계산 시에는 m 단위로 변환해야 합니다. (키(m) = 키(cm) / 100.0)