c언어 막 시작한 초보자입니다... 정수와 실수까지는 입력이 되는데 문자를 바료 입력 안받고 넘어가버립니다.. 이유가 뭘까요

조회수 1548회
int main()
{
    int a;
    float b;
    char c1;
    printf("정수 입력 : ");
    scanf("%d", &a);

    printf("실수 입력 : ");
    scanf("%f", &b);

    printf("문자 입력 : ");
    scanf("%c", &c1);

    printf("%d\n %f\n", a, b);
    printf("%c\n", c1);

    return 0;
}

2 답변

  • 키보드로 입력한 값은 입력 스트림이라는 곳에 저장이 되고, scanf 함수는 입력 스트림에서 값을 읽어옵니다.

    이 때, scanf 함수는 %d 또는 %f 같은 포맷형식을 참고해서 입력 스트림에서 그에 맞는 형태의 값을 읽어 드립니다. 그런데 %c 같은 경우에는 입력 스트림에서 문자 하나를 그냥 가져 옵니다.

    작성하신 코드에서 문제가 뭐냐하면 scanf("%f", &b);에서 사용자가 실수값을 치고 엔터키를 누를텐데, 이 때 실수값과 엔터값(줄바꿈값, '\n')이 입력 스트림에 저장됩니다. 그리고 "%f"로 해석하여 입력 스트림안에서 실수형태의 값을 가져다가 b에 저장합니다. 이러고 나면 입력 스트림에는 엔터값(줄바꿈값, '\n')이 남아 있는 상태입니다.

    이 상태에서 scanf("%c", &c1);이 실행되는 순간 입력스트림에 남아 있던 '\n'이 c1에 저장되고 scanf 함수가 종료되게 됩니다.

    그래서 이러한 문제를 피하기 위해서는 "%c"라고 쓰지 말고, 앞에 공백을 하나 넣어서 " %c"로 하는 것을 공식 문서 등에서 추천하고 있습니다. 이렇게 공백 하나를 넣게되면 입력 스트림속에있는 스페이스나 줄바꿈, 탭 등을 저 공백하나가 흡수하게 되고 그러한 문자 뒤의 실제 글자 하나를 받아 들이게 됩니다.

    설명이 길었는데, 사용자의 입력을 얻는 경우라면 "%c"를 습관적으로 " %c"의 형태로 사용하시면 됩니다.

    아래 코드와 결과 참고하세요.

    -코드

    #include <stdio.h>
    
    int main()
    {
        int a; float b; char c1;
    
        printf("정수 입력 : ");
        scanf("%d", &a);
    
        printf("실수 입력 : ");
        scanf("%f", &b);
    
        printf("문자 입력 : ");
        scanf(" %c", &c1);
    
        printf("%d\n %f\n", a, b);
        printf("%c\n", c1);
    
        return 0;
    }
    
    • 결과

    이미지

    • 직전에 입력받은게 남아있다는것을 몰랐네요. 배워갑니다~ noah0508 2021.3.9 08:53
    • 와.... 생각지도 못했습니다.... 진짜 감사드려요 ㅠㅠㅠㅠ 알 수 없는 사용자 2021.3.9 12:54
  • 입력이 안되는 이유까지는 몰랐었지만 저는 이렇게 입력받을 %c를 %s로 바꿨어요.

    #include <stdio.h>
    
    int main()
    {
        int a; float b; char c1;
    
        printf("정수 입력 : ");
        scanf("%d", &a);
    
        printf("실수 입력 : ");
        scanf("%f", &b);
    
        printf("문자 입력 : ");
        scanf("%s", &c1);
    
        printf("%d\n %f\n", a, b);
        printf("%c\n", c1);
    
        return 0;
    }
    
    • %s를 하면 위에 분이 말씀하신 \n까지 입력을 받을 수 있나봅니다. ㅠㅠ 감사드려요 ㅠㅠ 알 수 없는 사용자 2021.3.9 12:55

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)