[C/C++] 13. printf / scanf 문자 입출력

찰규

·

2026년 8월 31일 (오늘)

앞서 함수와 반복문의 기본 개념과 흐름 제어를 알아보았다. 이번 글에서는 콘솔 환경에서 데이터를 화면에 출력하고 사용자로부터 입력을 받는 표준 입출력 함수인 printfscanf, 그리고 서식 지정자와 메모리 주소 전달 방식에 대해 정리한다.

1. 콘솔(Console) 환경과 입출력 함수

프로그램 실행 시 나타나는 검은 창을 흔히 콘솔 창(Windows의 명령 프롬프트, Linux의 쉘)이라고 부른다. 콘솔은 컴퓨터와 사용자 간의 가장 기본적인 텍스트 기반 입출력 인터페이스이다.

C/C++에서는 표준 라이브러리를 통해 이러한 콘솔 환경에 텍스트를 출력하거나 입력을 받아오는 함수를 기본 제공한다.

  • #include <stdio.h> (또는 <iostream>): printf, scanf와 같은 함수는 직접 구현하지 않고 표준 입출력 헤더 파일을 포함(Include)하여 사용한다. 컴파일러가 번역하기 전, 전처리기(Preprocessor) 단계에서 해당 헤더를 소스 코드에 결합한다.

2. printf 함수와 서식 지정자(치환 문자)

printf는 문자열을 콘솔 화면에 출력(Print Formatted)하는 함수다. 문자열 내에 특정 데이터를 원하는 위치에 끼워 넣기 위해 서식 지정자(치환 문자)를 사용한다.

#include <stdio.h>

int main() {
    int count = 10;
    float ratio = 3.14f;

    // %d 위치에 정수 변수 count의 값이 치환되어 출력
    printf("현재 카운트: %d\n", count);

    // %f 위치에 실수 변수 ratio의 값이 치환되어 출력
    printf("비율: %f\n", ratio);

    return 0;
}
  • %d (Decimal): 10진수 정수형 데이터를 출력할 때 사용한다.

  • %f (Float): 실수형 데이터를 출력할 때 사용한다.

  • 디버깅 도구로서의 활용: 중단점(Breakpoint)을 잡는 디버깅 외에도, 코드 중간중간 printf를 통해 변수의 변화나 반복문의 흐름을 콘솔 창에서 직관적으로 추적할 수 있다.

3. scanf 함수와 입력 대기(Blocking)

scanf는 콘솔 창을 통해 사용자로부터 키보드 입력을 받아 지정한 변수에 저장하는 함수다.

#include <stdio.h>

int main() {
    int input = 0;

    printf("정수를 입력하세요: ");
    // 사용자가 입력한 정수를 변수 input의 메모리 주소에 직접 저장
    scanf_s("%d", &input); 

    printf("입력받은 값: %d\n", input);
    return 0;
}
  1. 입력 대기(Blocking): scanf가 호출되면 프로그램은 사용자가 값을 입력하고 엔터(Enter)를 누를 때까지 실행을 멈추고 대기(무한 루프) 상태에 들어간다.

  2. & (주소 연산자) 사용 이유: 변수 이름 앞에 &를 붙이는 것은 해당 변수의 메모리 시작 주소를 넘겨주겠다는 의미다. scanf 함수 내부에서 외부 변수 input의 실제 메모리 위치를 찾아가 직접 값을 덮어써야 하기 때문이다.

  3. scanf_s: 최신 Visual Studio 환경에서는 버퍼 오버플로우 보안 취약점을 방지하기 위해 표준 scanf 대신 안전 버전인 scanf_s 사용을 권장한다.

4. printf와 scanf의 내부 동작 원리와 선행 지식

printfscanf는 단순한 출력·입력 함수처럼 보이지만, 내부적으로는 매우 복잡한 저수준(Low-level) 메커니즘으로 동작한다.

  • 문자 및 문자열의 메모리 저장 구조 (ASCII 코드, 널 종료 문자 \0)

  • 메모리 주소 체계와 포인터(Pointer)의 개념

  • 스택 프레임(Stack Frame) 및 가변 인자(Variadic Arguments) 처리 방식

이러한 선행 개념들을 확실히 학습한 뒤, 추후 심화 단계에서 printfscanf의 동작 원리를 메모리 관점에서 다시 상세히 분석할 예정이다.

마무리하며

  • printf는 서식 지정자(%d, %f 등)를 통해 특정 위치에 데이터를 치환하여 콘솔에 출력한다.

  • scanf는 사용자 입력을 받을 때까지 실행을 대기하며, 입력값을 저장할 변수의 메모리 주소(&변수명)를 요구한다.

  • 입출력 함수의 온전한 내부 동작 방식을 이해하기 위해서는 포인터와 메모리 구조에 대한 선행 학습이 필수적이다.