C : scanf() and getchar()

m_ngyeong·2024년 10월 7일
0

C

목록 보기
3/16
post-thumbnail

🖍️ scanf("%c", &a)에서 개행 문자(\n)를 입력으로 처리해 발생하는 문제.

scanf() 함수는 문자열을 입력받을 때 사용하는 함수, 공백을 기준으로 입력을 처리한다. 다시 말해, scanf()는 사용자가 입력할 때 \n 같은 공백 문자도 입력으로 인식한다.
이로 인해, 연속으로 scanf()를 사용하거나 반복문에서 scanf()를 사용했을 시에 개행 문자(\n)를 입력으로 처리해 발생하는 문제가 발생한다. 이를 해결하기 위해서는 입력 버퍼에 남아있는 개행 문자(\n)를 입력 버퍼에서 정리해주거나, scanf()에서 개행 문자를 무시하도록 처리하는 방법이 있다.

I. 공백 문자(스페이스, 탭, 개행 문자 등) 활용
II. getchar() 활용


I. 공백 문자 활용

scanf()에서 공백 문자(스페이스, 탭, 개행 문자 등)를 활용하면 사용자가 입력할 때 받아온 \n 개행 문자를 건너뛴다. 그 이유는 scanf()에는 입력 형식 지정자에 대한 특별한 규칙이 있기 때문이다.

1. %c의 기본 동작:

  • %c는 문자를 하나만 읽어온다.
  • 기본적으로 공백 문자(스페이스, 탭, 개행 문자 등)도 포함하여 처리한다.
    즉, 사용자가 Enter(개행 문자)를 입력하면, 그것도 하나의 문자로 읽는다.

2. 공백 문자 처리:

  • 그러나, scanf()에서 %d, %f, %s와 같은 다른 형식 지정자들은 입력할 때 자동으로 공백 문자를 무시한다. 사용자가 Enter, 탭 또는 스페이스를 입력하면 이들은 무시되고 유효한 숫자나 문자열만 읽게 된다.
  • 공백을 무시하지 않는 예외는 %c%[]이다. 이들은 문자 하나만 읽어오는 것이 목적이므로, 공백도 문자로 처리한다.

3. 공백을 건너뛰는 방식:

  • %c 앞에 공백을 넣으면, scanf()공백 문자가 나오기 전까지 입력을 무시하게 된다. scanf()는 입력된 공백 문자(스페이스, 탭, 개행)를 발견하면 그것들을 모두 건너뛰고, 공백이 아닌 유효한 문자(알파벳, 숫자 등)가 나올 때까지 기다린다.

사용 예)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

void printMenu(){
    printf("===========================\n");
    printf("'c'섭씨온도에서 화씨온도로 변환\n");
    printf("'f'화씨온도에서 섭씨온도로 변환\n");
    printf("'q'종료\n");
    printf("===========================\n");
}

double C2F(double c_temp){
    return (9.0 / 5.0) * (c_temp + 32);
}

double F2C(double f_temp){
    return (5.0 / 9.0) * (f_temp - 32.0);
}

int main() {
    char temper;
    double temp; 
    
    while(1){
        printMenu();
        printf("메뉴에서 선택하세요: ");
        scanf(" %c", &temper);
    
        if(temper == 'c'){
            printf("섭씨온도: ");
            scanf(" %lf", &temp);
            printf("화씨온도: %lf \n\n", C2F(temp));
        }
            
        else if(temper == 'f'){
            printf("화씨온도: ");
            scanf(" %lf", &temp);
            printf("섭씨온도: %lf \n\n", F2C(temp));
        }
        else if(temper == 'q') break;
    }
    
    return 0;
}

👿

  • %c는 입력된 공백 문자도 포함해 모든 문자를 그대로 읽어온다.
  • scanf(" %c", &a);와 같이 %c 앞에 공백을 추가하면, 공백 문자(개행 포함)를 무시하고, 첫 번째 공백이 아닌 문자를 입력으로 받아 처리한다. 이는 scanf()의 일반적인 동작 규칙 중 하나로, %c 앞에 공백을 두면 "공백을 무시하고" 문자를 읽겠다는 의미이다.

II. getchar() 활용

getchar()란?

getchar()는 C 언어에서 사용자 입력을 한 문자씩 읽어오는 함수이다. 표준 입력(키보드)으로부터 한 글자(문자)를 읽어오는 역할을 하며, 리턴값으로 그 문자의 ASCII 값을 반환한다. 또한, scanf() 호출 후 남아 있는 개행 문자를 제거하는 용도로 자주 사용된다.

  • 문자 단위 입력: getchar()는 사용자가 입력한 문자를 하나씩 읽어, 사용자가 여러 글자를 입력해도 호출될 때마다 한 글자씩 처리한다.
  • 문자 반환: 사용자가 입력한 문자의 ASCII 코드를 반환한다.
    예를 들어, 사용자가 'A'를 입력하면, getchar()는 그 문자의 ASCII 값인 65를 반환한다.
  • 버퍼에서 읽음: 사용자가 입력한 문자는 키를 누를 때마다 즉시 프로그램으로 전달되는 것이 아니라, 일단 입력 버퍼라는 곳에 저장된다. getchar()는 이 버퍼에 있는 내용을 차례로 읽는다. 사용자가 Enter를 누르면, 그때 입력한 내용이 버퍼에 저장되고 getchar()는 한 글자씩 읽어온다.

사용 예)

#include <stdio.h>

int main() {
    char ch;

    printf("문자 하나를 입력하세요: ");
    ch = getchar();  // 한 문자를 입력 받음
    printf("입력한 문자: %c\n", ch);

    return 0;
}
  • 프로그램을 실행하고 'A'를 입력하면, getchar()가 'A'를 읽고 반환하며, 그 결과 A가 출력.
  • 입력한 문자를 처리하고 버퍼에 남은 문자(예: 개행 문자 \n)는 다음 호출에서 처리됨.

getchar()의 작동 방식:

  1. 사용자가 키보드에서 어떤 문자를 입력하고 Enter를 치면, 그 내용이 버퍼에 저장됨.
  2. 그 후에 getchar()를 호출하면, 버퍼에 있는 문자 중 첫 번째 문자를 읽고 그 문자를 반환다.
  3. 이후 다시 getchar()를 호출하면, 버퍼에서 다음 문자를 읽어옴.
  4. 사용자가 입력을 완료하고 Enter를 누를 때까지 버퍼에 쌓인 모든 문자가 남아있고, getchar()는 이를 하나씩 처리.

getchar()를 쓰는가?

1. 입력 버퍼 정리:

종종 scanf()로 입력할 때, 입력 버퍼에 개행 문자(Enter)가 남아 있는 경우가 있다. 다음 입력을 받을 때 이 개행 문자가 문제가 될 수 있는데, getchar()로 버퍼를 비워줄 수 있다.
예를 들어, scanf() 뒤에 getchar()를 추가해버리면 개행 문자를 처리하여 버퍼를 깨끗하게 만들 수 있다.

scanf("%d", &num);
getchar();  // 버퍼에 남아있는 '\n'을 제거

2. 한 글자 입력 받기:

getchar()는 문자를 하나씩 정확하게 읽고 싶을 때 사용된다.
예를 들어, 사용자가 입력한 메뉴 선택을 처리할 때 getchar()를 쓰면 편리하다.

👿

  • getchar()는 표준 입력에서 한 글자씩 문자를 읽어오는 C 언어의 함수이다.
  • 입력을 한 문자씩 처리하거나,scanf() 호출 후 남아 있는 개행 문자를 제거하는 용도로 자주 사용됩니다.

profile
사용자 경험 향상과 지속적인 성장을 추구하는 프론트엔드 개발자 ʚȉɞ

0개의 댓글