201303/if문과 switch문. 문자입출력함수[getchar(), putchar()]

2013. 4. 3. 16:47프로그래밍/C언어 TIP

◈ if문과 switch문

아래의 소스는 시험 점수를 입력 받아 다중if문을 이용하여 학점을 출력하는 소스이다. A ~ C까지의 학점만 표시되고 나머지는 F값을 100초과의 값은 "잘못된 점수입니다"라는 메시지가 출력되게 한다.

#include <stdio.h>

int main()

{

    int iNum;

    printf("점수를 입력하세요: ");

    scanf("%d", &iNum);

 

    if((100 >= iNum) && (90 <= iNum))

    {

        printf("A\n");

    }

    else if((90 > iNum) && (80 <= iNum))

    {

        printf("B\n");

    }

    else if((80 > iNum) && (70 <= iNum))

    {

        printf("C\n");

    }

    else if((70 > iNum) && (0 < iNum))

    {

        printf("F\n");

    }

    else if(100 < iNum)

    {

        printf("잘못된 점수입니다.\n");

    }

    return 0;

 

다음은 switch문을 이용하여 위와 같은 동일한 출력을 하게 하는 프로그램 소스이다. if문과 다르게 조건을 주는 영역이 없고 case의 뒤에는 상수하나만 올 수 있기 때문에 iNum = iNum / 10; 이라는 명령문을 입력해준다. 100을 입력했을때 10이 나오게 되는 것이다. 그렇게 해서 아래와 같은 case가 나오게 된다. case 10과 case 9는 모두 A에 해당되므로 함께 써줘도 무관하다. break문은 switch문의 탈출명령어이며, 제어문에서만 해당된다.

ex) while, switch, for

#include <stdio.h>

int main()

{

    int iNum;

    printf("점수를 입력하세요: ");

    scanf("%d", &iNum);

 

    iNum = iNum / 10;    

 

    switch(iNum)

    {

        case 10:

        case 9:

            printf("A\n");

            break;

 

        case 8:

            printf("B\n");

            break;

 

        case 7:

            printf("C\n");

            break;

 

        default:

            printf("F\n");

        break;

    }

    

    return 0;

} 
 


switch문의 형식은 다음과 같다. switch문 뒤의 괄호 속에 정수 값을 가지는 변수 또는 수식이 올 수 있다. switch문의 실행부는 중괄호에 둘러싸인다. case문은 예약어 case로 시작하여 정수 값을 가지는 상수와 콜론(:)이 오고, 그 뒤에 명령문들이 온다. 여러 case문의 마지막에는 default문이 온다. default문은 case문이 하나도 실행되지 않았을 경우 실행된다. 생략이 가능하지만 오류나 예외일 경우의 메시지를 출력하는데 사용하면 편리하다.

 

예제 : p3-9.c

0에서 9까지 입력받아 영어로 출력하는 프로그램 소스이다.

#include <stdio.h>

int main()

{

    char ch;

 

    printf("Please enter a number between 0 to 9: ");

    scanf("%c", &ch);

    switch (ch)

    {

        case 48:

            printf("Input Number is Zero.\n");

            break;

    

        case 49:

            printf("Input Number is One.\n");

            break;

 

        case 50:

            printf("Input Number is Two.\n");

            break;

 

        case 51:

            printf("Input Number is Three.\n");

            break;

 

        case 52:

            printf("Input Number is Four.\n");

            break;

 

        case 53:

            printf("Input Number is Five.\n");

            break;

 

        case 54:

            printf("Input Number is Six.\n");

            break;

 

        case 55:

            printf("Input Number is Seven.\n");

            break;

 

        case 56:

            printf("Input Number is Eight.\n");

            break;

 

        case 57:

            printf("Input Number is Nine.\n");

            break;

 

        default:

            printf("wrong number.\n");

    }

    return 0;

} 
 


문자로 입력받은 1을 아스키코드에서 찾아 10진수 숫자와 일치하는 case에 들어가 프로그램을 실행하게 된다. 실행을 마치면 break문에 의해 switch문을 빠져 나오게 된다.

 

◈ 문자 입출력 함수

◦ getchar() 와 putchar()

getchar()는 scanf()함수와 함께 C에서 사용되는 입력함수 중에 하나이다. 입력되는 문자를 하나씩 읽는 함수이다. 키보드로부터 입력이 있을 때까지 블럭(block)상태를 유지한다. getchar()함수는 ANSI C표준으로 정의 되어 있고, <stdio.h>헤더파일에 선언되어 있다.

getchar()와 함께 쓰이는 출력함수는 putchar()이다. putchar()함수 역시 한 글자만을 출력할 수 있다.getchar()와 putchar()의 장점은 형식지정자를 사용할 필요가 없으며, 실행속도가 빠른 점이다.

아래의 소스는 getchar()와 putchar()함수를 이용하여 키보드로부터 한 문자를 입력받아 화면에 출력하는 프로그램 소스이다. scanf()와 printf()함수와도 비교해보자.

#include <stdio.h>

int main()

{

    char ch;

 

    printf("Please enter any character: ");

    ch = getchar();         //문자입력

    putchar (ch);         //문자출력

    printf(" is a letter you typed.\n");

    fflush (stdin);

    printf("Please enter any character: ");

    scanf("%c", &ch);

    printf("%c is a letter you typed.\n",ch);

 

    return 0;

}

getchar()함수를 통해 키보드로부터 입력받은 문자는 변수 ch에 기록된다. 데이터를 입력한 후 엔터 키를 누를 때까지 저장하는 공간이 바로 버퍼(임시 저장공간)이다. 버퍼를 사용하는 이유는 키보드에 누를 때마다 프로그램으로 문자를 전송하는 것보다 한 줄을 모두 입력받아 한꺼번에 전송하는 것이 전송속도를 줄일 수 있기 때문이다.

가운데 위치한 fflush (stdin);명령문은 getchar()함수로 문자를 읽은 후 버퍼에 엔터 키가 남아 있기 때문에, 입력버퍼를 비우기 위해서 호출하게 된다.