C언어 초급 - 4장: 입출력 함수 (4.1 입력 함수 scanf())

2025. 2. 23. 16:39프로그래밍 언어/C

4.1 입력 함수 scanf()

C 언어에서 scanf() 함수는 사용자가 입력한 데이터를 변수에 저장하는 역할을 합니다.
scanf()는 표준 입력(키보드)에서 데이터를 읽어 변수에 저장하는 함수이며, #include <stdio.h> 헤더 파일을 포함해야 사용할 수 있습니다.


1. scanf() 함수란?

  • scanf()는 키보드로부터 입력된 값을 변수에 저장하는 함수입니다.
  • 형식 지정자(Format Specifier)를 사용하여 입력받을 데이터의 유형을 지정합니다.
  • 공백(띄어쓰기, 엔터, 탭 등)을 기준으로 입력을 구분합니다.

1.1 scanf() 함수 기본 문법

scanf("형식 지정자", &변수);

📌 주의할 점

  • &(앰퍼샌드)를 변수 앞에 붙여 메모리 주소를 전달해야 값이 저장됨 (char 배열 제외).
  • 입력 형식에 맞지 않는 데이터를 입력하면 오류가 발생할 수 있음.

2. 정수 입력 (%d)

정수를 입력받으려면 %d 형식 지정자를 사용합니다.

2.1 정수 입력 예제

#include <stdio.h>

int main() {
    int num;

    printf("정수를 입력하세요: ");
    scanf("%d", &num);

    printf("입력한 정수: %d\n", num);

    return 0;
}

실행 예시

정수를 입력하세요: 42
입력한 정수: 42

📌 주의할 점

  • scanf("%d", &num); → 변수 num의 메모리 주소(&num)를 전달해야 값이 저장됨.
  • 숫자가 아닌 문자를 입력하면 예기치 않은 동작이 발생할 수 있음.

3. 실수 입력 (%f, %lf)

실수를 입력받으려면 %f(float), %lf(double) 형식 지정자를 사용합니다.

3.1 실수 입력 예제

#include <stdio.h>

int main() {
    float num1;
    double num2;

    printf("float형 실수 입력: ");
    scanf("%f", &num1);

    printf("double형 실수 입력: ");
    scanf("%lf", &num2);

    printf("입력한 float: %.2f\n", num1);
    printf("입력한 double: %.6lf\n", num2);

    return 0;
}

실행 예시

float형 실수 입력: 3.14
double형 실수 입력: 2.718281
입력한 float: 3.14
입력한 double: 2.718281

📌 주의할 점

  • float → %f, double → %lf 사용 (%lf는 double용).
  • 출력할 때 소수점 자리수를 지정할 수 있음 (%.2f → 소수점 2자리까지 출력).

4. 문자 입력 (%c)

문자를 입력받으려면 %c 형식 지정자를 사용합니다.

4.1 단일 문자 입력 예제

#include <stdio.h>

int main() {
    char ch;

    printf("문자 입력: ");
    scanf(" %c", &ch);  // 공백 추가

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

    return 0;
}

실행 예시

문자 입력: A
입력한 문자: A

📌 주의할 점

  • scanf(" %c", &ch); → 공백(" ")을 추가해야 이전 입력(엔터, 공백)과 충돌하지 않음.
  • 공백을 넣지 않으면 이전 입력의 개행 문자(\n)가 ch에 저장될 수 있음.

5. 문자열 입력 (%s)

문자열을 입력받으려면 %s 형식 지정자를 사용합니다.

5.1 문자열 입력 예제

#include <stdio.h>

int main() {
    char name[20];

    printf("이름을 입력하세요: ");
    scanf("%s", name);

    printf("입력한 이름: %s\n", name);

    return 0;
}

실행 예시

이름을 입력하세요: Alice
입력한 이름: Alice

📌 주의할 점

  • 문자열을 받을 때는 &(앰퍼샌드) 없이 변수명만 사용 (scanf("%s", name);).
  • 띄어쓰기 이후 문자는 무시됨.
    예를 들어 "Alice Wonderland"을 입력하면 "Alice"만 저장됨.

6. scanf()에서 여러 개의 값 입력받기

scanf()를 사용하여 여러 개의 값을 한 번에 입력받을 수도 있습니다.

6.1 여러 값 입력 예제

#include <stdio.h>

int main() {
    int age;
    float height;

    printf("나이와 키를 입력하세요 (예: 25 175.5): ");
    scanf("%d %f", &age, &height);

    printf("입력한 나이: %d\n", age);
    printf("입력한 키: %.1f cm\n", height);

    return 0;
}

실행 예시

나이와 키를 입력하세요 (예: 25 175.5): 30 180.2
입력한 나이: 30
입력한 키: 180.2 cm

📌 주의할 점

  • 공백(띄어쓰기) 또는 엔터로 값을 구분하여 입력해야 함.

7. scanf()의 개행 문자(\n) 처리

scanf()는 입력 후 엔터(\n)를 남겨두기 때문에, 이후 char 입력이 예상치 못한 동작을 할 수 있습니다.

7.1 scanf() 입력 후 개행 문자 처리

#include <stdio.h>

int main() {
    int age;
    char grade;

    printf("나이를 입력하세요: ");
    scanf("%d", &age);

    getchar();  // 개행 문자 처리

    printf("학점(A/B/C/D/F)을 입력하세요: ");
    scanf("%c", &grade);

    printf("입력한 나이: %d\n", age);
    printf("입력한 학점: %c\n", grade);

    return 0;
}

📌 설명

  • getchar(); → scanf()가 남긴 개행 문자(\n)를 제거하는 역할.

8. 정리

입력 형식 형식 지정자 사용 예제
정수 입력 %d scanf("%d", &num);
실수 입력 (float) %f scanf("%f", &num);
실수 입력 (double) %lf scanf("%lf", &num);
문자 입력 %c scanf(" %c", &ch); (공백 추가)
문자열 입력 %s scanf("%s", name);

📌 입력 시 주의할 점

  • %c 사용 시 공백(" ")을 추가하여 개행 문자 문제 방지.
  • 문자열 입력(%s)은 공백을 포함하지 않으며, 개행(\n)을 남기지 않음.
  • getchar()를 사용하여 scanf()가 남긴 개행 문자를 제거 가능.