C에서 scanf 함수 마스터하기: 포맷 지정자, 입력 검증 및 흔히 발생하는 함정

1. scanf 함수 개요

C 프로그래밍 언어를 배우면서 프로그램에 데이터를 입력하는 가장 많이 사용되는 방법 중 하나가 scanf 함수입니다. 이 함수는 프로그램의 “청취자” 역할을 하여 사용자가 입력한 데이터를 지정된 변수에 저장합니다.

scanf의 기본 구문

scanf("formatSpecifier", &variable);

여기서 핵심 요소는 “formatSpecifier”(형식 지정자)와 변수 앞의 앰퍼샌드(&)입니다. 형식 지정자는 입력될 데이터의 타입을 지정하고, &는 해당 변수의 주소를 나타냅니다. 이 규칙을 따르면 scanf가 사용자 입력을 올바르게 처리할 수 있습니다.

int num;
scanf("%d", &num);

이와 같이 scanf는 프로그램에 입력을 제공하고 그 데이터를 사용할 수 있게 합니다.

2. 자주 사용되는 형식 지정자

  • %d : 정수용
  • %f : float 형 실수용
  • %lf : double 형 고정밀 실수용
  • %s : 문자열용 (공백으로 구분)
  • %c : 단일 문자용
double val;
scanf("%lf", &val);

3. 여러 입력을 동시에 처리하기

int age;
float height;
scanf("%d %f", &age, &height);
printf("Age: %d, Height: %.2fn", age, height);

4. 입력 검증 및 오류 처리

int age;
printf("Please enter your age (0–120): ");
if (scanf("%d", &age) == 1 && age >= 0 && age <= 120) {
    printf("The entered age is %d years.n", age);
} else {
    printf("Invalid age.n");
}

5. 입력 스트림 비우기

scanf를 사용할 때 “이전 입력이 남아 있다”는 느낌을 받을 수 있습니다. 이는 개행 문자(\n) 등과 같은 문자가 입력 스트림에 남아 있기 때문입니다.

scanf("%*[^n]");
scanf("%*c");

이렇게 하면 입력 버퍼에 남아 있는 개행 문자나 기타 문자를 건너뛸 수 있습니다. 그러나 반복문 안에서 비표준 fflush(stdin) 사용을 피하고, 위와 같은 방법을 사용해 안전하게 처리하는 것이 좋습니다.

6. 흔히 발생하는 실수와 모범 사례

  • 형식 지정자 일치: 데이터 타입과 지정자를 맞추기
  • 문자열 길이 주의: %s 입력 시 버퍼 크기를 고려하기
  • 스트림 비우기: 개행 문자를 남기지 않기

7. 고급 사용 | 정교한 scanf 기법

char name[20];
printf("Please enter your name: ");
scanf("%19s", name);  // buffer-safe measure
printf("Hello, %s!n", name);

요약

scanf 함수는 C에서 기본적인 입력 방법입니다. 형식 지정자, 오류 검사, 입력 스트림 처리를 이해하면 안전하게 사용할 수 있습니다. 남아 있는 입력 버퍼와 버퍼 오버플로우 문제에 특히 주의하세요.