12-1-바.문자 관리 함수

다음은 문자열을 구성하는 개별 문자들을 관리하는 함수에 대해 알아보자. 이 함수들은 인수로 전달된 문자가 특정 그룹에 속하는지 조사하는데 그룹에 속하면 0이 아닌 값을 리턴하고 그렇지 않다면 0을 리턴한다. 모두 ctype.h에 선언되어 있으며 C 표준 함수 중에 손에 꼽을만큼 쉬운 함수들이라 도표로 간단하게 정리하도록 한다.

 

함수

참이 되는 문자 범위

int isalpha(int c);

A-Z, a-z

int isupper(int c);

A-Z

int islower(int c);

a-z

int isdigit(int c);

0-9

int isxdigit(int c);

0-9, A-F, a-f

int isalnum(int c);

0-9, A-Z, a-z

int isprint(int c);

인쇄 가능한 문자

int isgraph(int c);

공백을 제외한 인쇄 가능한 문자

int ispunct(int c);

인쇄 가능한 문자중 공백과 isalnum 제외한 문자

int isspace(int c);

0x09-0x0d, 0x20

 

특정 문자가 알파벳인지, 숫자인지 등을 판단하고 싶을 때 이 함수들을 호출한다. 예를 들어 점수를 입력할 때는 입력받은 모든 문자가 아라비아 숫자인지 점검해야 하며 이때는 isdigit 함수를 사용한다. 다음 두 함수는 영문 대소문자를 변환한다.

 

int tolower(int c);

int toupper(int c);

 

만약 c가 영문자가 아니라면 아무 동작도 하지 않으며 c를 그대로 리턴한다. 입력값을 비교할 때 둘 다 비교하는 것보다 한쪽으로 바꾼 후 비교하는 것이 더 쉽다. 다음 두 코드는 동일하다.

 

if (ch == 'A' || ch == 'a') { ... }

if (tolower(ch) == 'a') { ... }

 

두 조건을 || 논리 연산자로 비교하는 것보다 소문자로 바꾼 후 'a'와 비교하는 것이 훨씬 더 쉽다. 물론 대문자로 바꾼 후 'A'와 비교해도 결과는 같다. 특히 switch문의 경우 대소문자별로 일일이 case를 두 번 쓰는 것보다 변환한 결과로 다중 분기를 하는 것이 훨씬 더 간단하고 깔끔하다.

 

switch (ch) {

     case 'A':

     case 'a':

          어쩌고 저쩌고;break;

     case 'B':

     case 'b':

          시끌 시끌;break;

     // 계속 이런 식으로 다중 분기

}

 

switch (tolower(ch)) {

     case 'a':

          어쩌고 저쩌고;break;

     case 'b':

          시끌 시끌;break;

     // 계속 이런 식으로 다중 분기

}

 

누가 봐도 왼쪽의 코드보다는 오른쪽의 코드가 더 간단해 보이고 가독성도 높다. 뿐만 아니라 속도도 빠르고 메모리도 적게 차지한다.