Core Programming/C Standard Library: Resource & Performan

C언어 입출력 완전 정복: stdio.h printf scanf 서식 지정자 총정리

임베디드 친구 2025. 2. 2. 11:00
반응형

C언어 프로그래밍의 가장 기본이 되는 단계는 바로 데이터를 화면에 출력하고 사용자의 입력을 받는 것입니다. 이를 가능하게 해주는 핵심 도구가 바로 stdio.h 헤더 파일입니다.

오늘은 C언어 입출력의 기초이자 필수인 stdio.h의 역할과 printf, scanf 함수의 완벽한 사용법에 대해 정리해 보겠습니다.

Generated by Gemini AI.


1. stdio.h란 무엇인가? (Standard Input Output Header)

stdio.h는 Standard Input Output Header의 약자로, C 언어에서 표준 입출력 기능을 제공하는 헤더 파일입니다. 프로그램을 작성할 때 상단에 #include <stdio.h>를 선언하는 이유는 시스템의 기본적인 통로(스트림)를 사용하기 위해서입니다.

주요 입출력 스트림

  • stdin: 표준 입력 (일반적으로 키보드)
  • stdout: 표준 출력 (일반적으로 모니터 콘솔)
  • stderr: 표준 오류 (에러 메시지 출력용)

2. printf 함수: 데이터를 화면에 출력하기

printf는 "print formatted"의 약자로, 지정된 형식(Format)에 맞춰 데이터를 출력하는 함수입니다.

2.1 printf 기본 사용법

C
 
#include <stdio.h>

int main() {
    printf("Hello, World!\n"); // \n은 줄바꿈 문자입니다.
    return 0;
}

2.2 핵심 서식 지정자 (Format Specifiers)

변수의 타입을 컴퓨터에게 알려주기 위해 서식 지정자를 사용합니다.

서식 지정자 데이터 타입 설명
%d int 10진수 정수
%f float / double 실수 (소수점)
%.2f double 소수점 둘째 자리까지 출력
%c char 단일 문자
%s char[] (String) 문자열
%p void* 포인터의 메모리 주소
%x / %o int 16진수 / 8진수

3. scanf 함수: 사용자로부터 데이터 입력받기

scanf는 사용자로부터 데이터를 입력받아 변수에 저장할 때 사용합니다.

3.1 scanf 사용 시 주의사항 (중요!)

  1. 주소 연산자(&): 변수명 앞에 &를 붙여야 합니다. 이는 해당 변수의 메모리 주소에 직접 접근하여 값을 저장하기 위함입니다. (단, 문자열 %s 예외)
  2. 입력 버퍼: 입력 시 남은 공백이나 개행 문자가 다음 입력에 영향을 줄 수 있습니다.

3.2 입력 예제 코드

C
 
#include <stdio.h>

int main() {
    int age;
    float height;
    char name[30];

    printf("이름, 나이, 키를 순서대로 입력하세요: ");
    // 문자열(name)은 그 자체로 주소이므로 &를 붙이지 않습니다.
    scanf("%s %d %f", name, &age, &height);

    printf("\n--- 입력 결과 ---\n");
    printf("이름: %s\n나이: %d세\n키: %.1fcm\n", name, age, height);

    return 0;
}

4. 실전 활용: 간단한 사칙연산 계산기

입출력을 응용하여 연산자를 입력받고 결과를 출력하는 프로그램을 작성해 보겠습니다.

C
 
#include <stdio.h>

int main() {
    int n1, n2;
    char op;

    printf("수식 입력 (예: 10 + 5): ");
    if (scanf("%d %c %d", &n1, &op, &n2) != 3) {
        printf("입력 형식이 잘못되었습니다.\n");
        return 1;
    }

    switch (op) {
        case '+': printf("결과: %d\n", n1 + n2); break;
        case '-': printf("결과: %d\n", n1 - n2); break;
        case '*': printf("결과: %d\n", n1 * n2); break;
        case '/':
            if (n2 != 0) printf("결과: %.2f\n", (float)n1 / n2);
            else printf("Error: 0으로 나눌 수 없습니다.\n");
            break;
        default: printf("Error: 지원하지 않는 연산자입니다.\n");
    }

    return 0;
}

5. [추가 팁] 더욱 안전한 프로그래밍을 위하여

최신 C 표준이나 Visual Studio 환경에서는 scanf의 보안 취약점 때문에 scanf_s 사용을 권장하기도 합니다.

  • scanf의 위험성: 입력받을 크기를 지정하지 않으면 설정된 메모리 크기를 넘어서는 버퍼 오버플로우가 발생할 수 있습니다.
  • 해결책: 문자열 입력 시에는 크기를 제한하거나, fgets() 함수를 사용하여 메모리 안전성을 높이는 습관을 들이는 것이 좋습니다.

마치며

stdio.h는 C언어 학습의 시작이자 끝이라고 할 만큼 중요합니다. printf로 데이터를 확인하고 scanf로 사용자와 소통하는 법을 익혔다면, 이제 더 복잡한 제어문과 자료구조로 나아갈 준비가 된 것입니다.


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형