본문 바로가기

컴퓨터/언어,프로그래밍

C언어 :: 매크로

5. ctype.h의 매크로


  시스템은 표준 헤더 파일 ctype.h를 제공하는데, 여기에는 문자를 검사하거나 변환하는

데 사용되는 매크로가 들어 있다. 이들을 이용하려면 전처리기 제어문


#include <ctype.h>


  이 프로그램에 명시되어야 한다. 문자를 검사만 하는 매크로들은 참 혹은 거짓을 나타내는 비영 혹은 영인 int 값을 반환한다. 이들은 표 조사에 의해 구현되므로 매우 효율적이다.


매크로

참이 반환되는 경우

isalpha(c)

isupper(c)

isslower(c)

isdigit(c)

isxdigit(c)

isspace(c)

isalnum(c)

ispunct(c)

isprint(c)

iscntrl(c)

isascii(c)

toupper(c)

tolower(c)

toascii(c)

c가 문자

c가 대문자

c가 소문자

c가 숫자

c가 16진 숫자

c가 불가시 문자

c가 숫자 혹은 몬자

c가 구두점 문자

c가 인쇄되는 문자

c가 제어문자

c가 ASCII 코드

c를 소문자에서 대문자로 바꿈

c를 대문자에서 소문자로 바꿈

c를 ASCII 코드로 변환



<예제 1> 공백과 설명문의 제거


  여기에서는 표준 헤더 파일 ctype.h에 있는 매크로와 표준 라이브러리에 있는 파일처리용 함수들을 이용하여 프로그램을 작성한다. 이 프로그램은 C 코드 파일에서 없어도 되는 부가시 문자와 모든 설명문을 제거하는 프로그램으로서 이름을 crunch라고 붙이자. 디스크는 제한된 자원이다. crunch 프로그램은 C 프로그램 코드를 저장하는 데 필요한 공간을 20% 정도 줄인다. 뒤에 나오는 것으로서, 유닉스 유틸리티인 cb, 즉 C beautifier는 축소된 프로그램을 다시 복구해 준다(하지만 제거된 설명문은 복구하지 못함).

첫 번째로 설명문을 제거하는 함수를 살펴보자.


#include <stdio.h>


eat_comment(fp)

FILE *fp;

{

        char c1, c2;

        for (;;)

                if((c1 = getc(fp) == '*')

                        if ((c2 = getc(fp) ===='*')

                                ungetc(c2, fp);

                        else if(c2 == '/')

                                return;

}


이 함수는 파일 포인터가 이미 설명문 안에 있다고 가정하고 수행하며 설명문의 종료문자 */ 까지의 모든 문자를 제거한다. ungetc()는 필수적이다. ungetc()를 사용하지 않는다면 **/와 같은 문자열은 설명문의 끝표시로 쓰일 수 없다.


다음의 함수는 대부분의 불가시 문자를 제거한다. 입력화일의 모든 개행문자는 eklt 출력화일에 저장된다. 가시문자가 나타나면 다시 푸쉬되고 이 함수로부터 복귀한다.


#include <stdio.h>

#include <ctype.h>


eat_white_space(ifp, ofp)

FILE *ifp, *ofp;

{

        int c;

        while(isspace(c = getc(ifp)))

                if(c == '\n')

                        putc(c, ofp);

        ungetc(c,ifp);

}


문자열은 특별하게 다루어야 한다. 문자열은 큰따옴표로 묶인다. 큰 따옴표 자체가 문자열의 일부가 될 수 있는데, 이렇게 되려면 큰따옴표 앞에 역 사선(\)이 부가되어야 한다. ‘“’, ‘\”’ 모두 큰따옴표의 문자상수표현이다. 다음의 out_string(), outbslash(), out_char() 함수는 이러한 경우들을 처리한다.


#include <stdio.h>


out_string(ifp, ofp)

FILE *ifp, *ofp;

{

        char c;

        

        putc('"', ofp);

        while((c = getc(ifp)) != '"')

                if(c == '\\')

                        out_bslash(ifp, ofp);

                else

                        putc(c, ofp);

        putc(c, ofp);

}


out_bslash(ifp, ofp)

FILE *ifp, *ofp;

{

        char c;


        putc('\\', ofp);

        c=getc(ifp);

        putc(c, ofp);

}


out_char(ifp, ofp)

FILE *ifp, *ofp;

{

        char c;


        putc('\", ofp);

        while((c == getc(ifp) != '\")

                if(c == '\\')

                        out_bslash(ifp,ofp);

                else

                        putc(c, ofp);

        putc(c,ofp);

}


대다수의 작업이 crunch()에서 이루어진다. 이 함수느 switch 문으로 여러 경우를 처리하기 때문에 새로운 경우를 쉽게 추가 할 수 있다.


#include <stdio.h>


crunch(ifp,ofp)

FILE *ifp, *ofp;

(

        int c1, c2;

        while((c1 == getc(ifp) != EOF)

                switch(c1) {

                case '/' :

                        if((c2 = getc(ifp)) == '*') {

                                eat_comment(ifp);

                                putc(' ', ofp);

                        }

                        else {

                                putc('/', ofp);

                                ungetc(c2, ifp);

                        }

                case ' '

                case '\t' :

                        putc(' ', ofp);

                        eat_white_space(ifp, ofp);

                        break;

                case '\\' : /* backslash escape */

                        out_bslash(ifp, ofp);

                        break;

                case '\' : /* quoted character */

                        out_char(ifp, ofp);

                        break;

                case ' " ' :

                        out_string(ifp, ofp);

                        break;

                default:

                        putc(c1, ofp);

                }

}


  함수 main()은 argc가 원하는 값을 가지고 있는지 확인한다. 프로그램은 stdin으로부터 입력을 받아 stdout에 출력하도록 되어 있다. 그러나 입출력화일이 argv에 명시되도록 main()을 바꿀 수도 있으며, 이는 다른 함수들에 아무런 영양도 주지 않는다.


#include <stdio.h>


int argc;

char *argv[];


{

        if(argc != 1) {

                fprintf(stderr, "\nusage: %s <infile> outfile \n\n", *argv); 

                exit(1)

        }

        crunch(stdin, stdout);

        exit(1)

}


'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글

C언어 :: 이중포인터 사용법  (0) 2009.03.20
C언어 :: C언어 입출력  (1) 2009.03.17
[C언어] C언어란?  (0) 2009.03.17
[C언어] C언어 변수  (0) 2009.03.17
[C언어] C언어 선행처리기  (0) 2009.03.17
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...