Search

C++에서는 입출력 방식으로 std::cout / std::cinscanf / printf를 사용할 수 있다.
입력 형식을 제한하려는 상황에서 scanf가 std::cout에 비해 직관적이다.
아래는 입출력 방식에 따른 특성을 비교한 표이다.


입출력 방식 비교

  std::cout / std::cin scanf / printf
입력 형식에 제약이 없음 형식 제약 있음
출력 형식 제약 없음 형식 제약 있음

특정 상황에서의 선택 기준

예를 들어 정수형만 입력받기를 원하고, string 등 다른 형식이 들어올 경우 명확한 에러 처리를 하고 싶다면 scanf 방식이 보다 간단하게 처리될 수 있습니다.


세부 예시 및 에러 처리 방식

1. scanf를 사용할 경우

scanf는 입력 형식을 명시적으로 지정하기 때문에, 정수가 아닌 입력이 들어오면 자동으로 실패합니다.


    if (scanf("%d", &number) != 1) {
        printf("입력 오류: 정수가 아닙니다.\n");
        return 1;
    }

%d를 사용함으로써 정수 외의 입력(예: 문자열)은 자동으로 실패 처리됩니다.

실패 시 반환값은 1이 아니므로 이를 통해 에러 처리가 용이합니다.

  1. std::cin을 사용할 경우
    에러를 처리하려면 약간의 절차가 필요하다.

    if (!(std::cin >> number)) {
        std::cerr << "입력 오류: 정수가 아닙니다.\n";
        std::cin.clear(); // 에러 플래그 초기화
        std::cin.ignore(1000, '\n'); // 잘못된 입력 무시
        return 1;
    }

std::cin은 에러 이후 cin.clear()와 cin.ignore()라는 생소한 문법을 사용해야 된다. 이는 cin 에 남이있는 iostream 객체가 남이있고, 이를 초기화해주기 위함이다.

입력값이 달라짐에 따라 약간은 불규칙하게 출력한다.

std::cin >> int 동작 분석

C++에서 std::cin >> int는 숫자 이외의 문자가 포함될 경우 입력을 실패하고 에러 상태를 유지합니다. 아래 표는 대표적인 입력 예시들과 그에 대한 cin의 반응을 정리한 것입니다.

입력값 저장된 값 cin.fail() 결과 입력 스트림 상태 비고
1b 1 false b는 스트림에 남아 있음 숫자 1까지만 읽고 종료됨
1abc 1 false abc는 스트림에 남아 있음 동일하게 숫자만 읽음
as3 사용 안됨 true 전체가 스트림에 남아 있음 첫 문자가 숫자가 아니므로 실패

따라서 불규칙적이고, 생소한 문법이 쓰이는 std::cout보다는, scanf를 쓰는 것이 더 낫다.
이것은 입력값을 제한한다는 상황이라는 전제가 있다.

left
right

C

Contents