C 문자 분류
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
C 문자 분류는 C 프로그래밍 언어에서 문자를 분류하기 위한 함수들을 의미하며, 주로 ctype.h 헤더 파일에 정의되어 있다. 초창기 C 프로그래머들은 유닉스 운영체제에서 문자를 분류하기 위한 관용구를 개발했으며, 이후 표준 라이브러리에 표준화되었다. 이러한 함수들은 문자의 속성을 검사하거나 변환하는 데 사용되며, isalnum, isalpha, isdigit, tolower, toupper 등이 있다. 초기 구현에서는 매크로의 부작용으로 인한 문제점을 해결하기 위해 테이블 조회를 사용하는 방식으로 발전했다.
더 읽어볼만한 페이지
C 문자 분류 |
---|
2. 역사
초창기 C 프로그래머들은 유닉스 운영 체제 환경에서 문자를 분류하기 위한 독자적인 프로그래밍 관용구들을 개발하여 사용했다. 이러한 일반적인 문자 분류 기능들은 이후 C 표준 라이브러리의 헤더 파일인 ''ctype.h''에 인터페이스가 표준화되었다.
2. 1. 초기 구현 문제점과 해결
초창기 C 프로그래머들은 유닉스 운영 체제 환경에서 문자를 분류하기 위한 프로그래밍 관용구를 개발하여 사용했다. 예를 들어, 아래의 소스 코드는 ASCII 문자 `c`가 알파벳 대문자 또는 소문자인 경우 참으로 평가된다.('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')
이후 이러한 일반적인 문자 분류 기능들은 C 표준 라이브러리 헤더 파일인 ''ctype.h''에 인터페이스가 표준화되었다.
성능상의 이유로 표준 문자 분류 함수들은 종종 실제 함수 호출 대신 매크로(macro) 형태로 구현되었다. 그러나 매크로 평가는 특정 상황에서 문제를 일으킬 수 있어, 초기 리눅스 버전 등에서 사용된 다음과 같은 단순한 매크로 구현은 오늘날 잘 사용되지 않는다.
#define isdigit(c) ((c) >= '0' && (c) <= '9')
위와 같은 매크로 정의는 매개변수 `c`가 부작용(side effect)을 가지는 표현식으로 확장될 때 예기치 않은 결과를 낳을 수 있다. 예를 들어, `isdigit(x++)`와 같이 사용하면, 만약 `isdigit`이 함수였다면 `x`는 한 번만 증가했을 것이다. 하지만 위 매크로 정의에서는 `x`가 두 번 증가하게 된다.
이러한 문제를 해결하기 위해 일반적인 구현 방식은 매크로가 내부적으로 테이블 조회를 사용하도록 하는 것이다. 예를 들어, 표준 라이브러리는 256개의 정수 배열(각 문자 값에 해당하는 인덱스)을 미리 준비해둔다. 각 정수 값에는 해당 문자가 어떤 분류(숫자, 알파벳 등)에 속하는지에 대한 정보가 비트 필드(bit field) 형태로 저장되어 있다. 매크로는 전달된 문자 값을 인덱스로 사용하여 배열에서 해당 정수를 찾고, 원하는 분류에 해당하는 비트 필드를 확인한다. 예를 들어, 가장 낮은 비트(0번 비트)가 숫자인지 여부를 나타낸다고 가정하면, `isdigit` 매크로는 다음과 같이 구현될 수 있다.
#define isdigit(c) (TABLE[c] & 1)
이 방식에서는 매크로 인수 `c`가 테이블 인덱스로 단 한 번만 참조되므로, 부작용이 있는 표현식이 전달되더라도 의도한 대로 한 번만 평가된다.
3. 함수 목록
C 표준 라이브러리는 문자를 분류하고 변환하는 다양한 함수를 제공한다. 이러한 함수들은 크게 문자의 속성을 검사하는 함수와 문자를 다른 형태로 변환하는 함수로 나눌 수 있다.
단일 바이트 문자에 대한 함수는 `ctype.h` 헤더 파일(C++에서는 `cctype`)에 정의되어 있으며, 와이드 문자에 대한 함수는 `wctype.h` 헤더 파일(C++에서는 `cwctype`)에 정의되어 있다.
이 함수들의 동작은 현재 설정된 로케일에 따라 달라질 수 있다. 예를 들어, 특정 로케일에서는 기본 C 로케일에서 알파벳으로 간주되지 않는 문자를 알파벳 검사 함수(`isalpha` 등)가 알파벳으로 인식할 수 있다.
자세한 함수 목록과 설명은 아래 하위 섹션에서 확인할 수 있다.
- 문자 검사 함수
- 문자 변환 함수
3. 1. 문자 검사 함수
표준 C 라이브러리는 문자의 속성을 검사하는 여러 함수를 제공한다. 예를 들어, 주어진 문자가 숫자인지(isdigit
), 알파벳인지(isalpha
), 소문자인지(islower
) 등을 확인할 수 있다.단일 바이트 문자에 대한 함수는
ctype.h
헤더 파일(C++에서는 cctype
)에 정의되어 있으며, 와이드 문자에 대한 함수는 wctype.h
헤더 파일(C++에서는 cwctype
)에 정의되어 있다.성능을 위해 표준 문자 분류 함수는 일반적으로 함수 대신 매크로로 구현되기도 한다. 초기 리눅스 버전 등에서는 다음과 같이 간단한 비교 매크로를 사용했다.
#define isdigit(c) ((c) >= '0' && (c) <= '9')
그러나 이런 방식은 매크로 인자
c
에 부작용이 있는 표현식(예: x++
)이 사용될 경우 예기치 않은 결과를 초래할 수 있다. 예를 들어 isdigit(x++)
를 호출하면, 매크로 확장 과정에서 x
가 두 번 증가하게 된다. 함수로 구현되었다면 x
는 한 번만 증가했을 것이다.이러한 문제를 해결하기 위해 현대의 구현에서는 주로 테이블 조회 방식을 사용한다. 표준 라이브러리는 각 문자 값에 해당하는 정보를 담은 256개의 정수 배열을 미리 만들어 둔다. 각 정수는 지원하는 분류(숫자, 알파벳, 제어 문자 등)에 대한 비트 필드를 가진다. 매크로는 인자로 받은 문자 값을 인덱스로 사용하여 이 배열의 해당 정수를 찾고, 원하는 비트 필드 값을 확인하는 방식으로 동작한다. 예를 들어, 가장 낮은 비트가 숫자인지 여부를 나타낸다면
isdigit
매크로는 다음과 같이 구현될 수 있다.#define isdigit(c) (TABLE[c] & 1)
이 방식에서는 매크로 인자
c
가 한 번만 참조되므로 부작용 문제가 발생하지 않는다.주요 문자 검사 함수와 그 설명은 다음과 같다.
바이트 문자 함수 | 와이드 문자 함수 | 설명 |
---|---|---|
isalnum | iswalnum | 문자가 영숫자(알파벳 또는 숫자)인지 확인한다. |
isalpha | iswalpha | 문자가 알파벳인지 확인한다. |
islower | iswlower | 문자가 소문자인지 확인한다. |
isupper | iswupper | 문자가 대문자인지 확인한다. |
isdigit | iswdigit | 문자가 숫자인지 확인한다. |
isxdigit | iswxdigit | 문자가 16진수 숫자인지 확인한다. |
iscntrl | iswcntrl | 문자가 제어 문자인지 확인한다. |
isgraph | iswgraph | 문자가 그래픽 문자(공백 제외 출력 가능 문자)인지 확인한다. |
isspace | iswspace | 문자가 공백 문자 (스페이스, 탭, 개행 등)인지 확인한다. |
isblank | iswblank | 문자가 공백 문자(스페이스, 탭 등 단어 구분용)인지 확인한다. (C99 표준) |
isprint | iswprint | 문자가 출력 가능한 문자인지 확인한다. (공백 포함) |
ispunct | iswpunct | 문자가 구두점 문자인지 확인한다. |
이 함수들의 동작은 현재 설정된 로케일(locale)에 따라 달라질 수 있다. 예를 들어, 특정 로케일에서는 기본 C 로케일에서 알파벳으로 간주되지 않는 문자를 isalpha
함수가 알파벳으로 인식할 수 있다.
3. 2. 문자 변환 함수
단일 바이트 문자에 대한 변환 함수는 ctype.h 헤더 파일 (cctype)에 정의되어 있다. 와이드 문자에 대한 변환 함수는 wctype.h 헤더 파일 (cwctype)에 정의되어 있다.문자 변환은 유효한 로케일에 따라 평가된다.
바이트 문자 | 와이드 문자 | 설명 |
---|---|---|
tolower | towlower | 입력된 문자를 소문자로 변환한다. |
toupper | towupper | 입력된 문자를 대문자로 변환한다. |
towctrans | 특정 매핑 규칙에 따라 와이드 문자를 변환한다. | |
wctrans | towctrans 함수와 함께 사용할 변환 매핑 규칙을 반환한다. |
4. 함수 대조표
X로 표시된 부분은 해당 함수가 0 아닌 값을 반환한다.
{| class="wikitable"
! 범위 !! 문자 !! iscntrl !! isspace !! isupper !! islower !! isalpha !! isdigit !! isxdigit !! isalnum !! ispunct !! isgraph !! isprint
|-
| 0x00 - 0x08 ||제어 문자||X|| || || || || || || || || ||
|-
| 0x09 - 0x0D ||공백 제어 문자 '\t','\f','\v','\n','\r'||X||X|| || || || || || || || ||
|-
| 0x0E - 0x1F ||제어 문자||X|| || || || || || || || || ||
|-
| 0x20 ||공백 ' '|| ||X|| || || || || || || || ||X
|-
| 0x21 - 0x2F ||
|-
| 0x30 - 0x39 ||0123456789
|| || || || || ||X||X||X|| ||X||X
|-
| 0x3A - 0x40 ||
|-
| 0x41 - 0x46 ||ABCDEF
|| || ||X|| ||X|| ||X||X|| ||X||X
|-
| 0x47 - 0x5A ||GHIJKLMNOPQRSTUVWXYZ
|| || ||X|| ||X|| || ||X|| ||X||X
|-
| 0x5B - 0x60 ||
|-
| 0x61 - 0x66 ||abcdef
|| || || ||X||X|| ||X||X|| ||X||X
|-
| 0x67 - 0x7A ||ghijklmnopqrstuvwxyz
|| || || ||X||X|| || ||X|| ||X||X
|-
| 0x7B - 0x7E ||
바이트 문자 | 와이드 문자 | 설명 |
---|---|---|
isalnum | iswalnum | 문자가 영숫자(알파벳 또는 숫자)인지 확인한다. |
isalpha | iswalpha | 문자가 알파벳인지 확인한다. |
islower | iswlower | 문자가 소문자인지 확인한다. |
isupper | iswupper | 문자가 대문자인지 확인한다. |
isdigit | iswdigit | 문자가 숫자인지 확인한다. |
isxdigit | iswxdigit | 문자가 16진수 숫자인지 확인한다. |
iscntrl | iswcntrl | 문자가 제어 문자인지 확인한다. |
isgraph | iswgraph | 문자가 공백 문자를 제외한 출력 가능한 문자인지 확인한다. |
isspace | iswspace | 문자가 공백 문자인지 확인한다. (예: 스페이스, 탭, 개행 문자 등) |
isblank | iswblank | 문자가 단어를 구분하는 데 사용되는 공백 문자인지 확인한다. (일반적으로 스페이스와 탭) |
isprint | iswprint | 문자가 출력 가능한 문자인지 확인한다. (isgraph 문자 + 스페이스) |
ispunct | iswpunct | 문자가 구두점인지 확인한다. (isprint 문자 중 isalnum 이나 isspace 가 아닌 문자) |
tolower | towlower | 문자를 소문자로 변환한다. |
toupper | towupper | 문자를 대문자로 변환한다. |
iswctype | 문자가 특정 와이드 문자 클래스에 속하는지 확인한다. (wctype 함수로 얻은 클래스 사용) | |
towctrans | 특정 매핑을 사용하여 와이드 문자를 변환한다. (wctrans 함수로 얻은 매핑 사용) | |
wctype | iswctype 함수와 함께 사용할 와이드 문자 클래스를 나타내는 값을 반환한다. | |
wctrans | towctrans 함수와 함께 사용할 변환 매핑을 나타내는 값을 반환한다. |
5. C 표준 라이브러리와의 관계
초창기 C 프로그래머들은 유닉스 운영 체제에서 작업하며 문자를 분류하기 위한 프로그래밍 관용구들을 개발했다. 예를 들어, 다음 소스 코드는 ASCII 문자 `c`가 영문자일 경우 참으로 평가된다.
```c
('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')
```
이후 일반적인 문자 분류 기능에 대한 인터페이스는 C 표준 라이브러리 헤더 파일인 `ctype.h`에 표준화되었다.
성능을 위해 표준 문자 분류 함수는 일반적으로 함수 대신 매크로로 구현된다. 그러나 초기 리눅스 버전 등에서 사용된 단순한 매크로 구현 방식은 문제가 있었다.
```c
#define isdigit(c) ((c) >= '0' && (c) <= '9')
```
위와 같은 매크로는 매개변수 `c`가 부작용이 있는 표현식(예: `x++`)으로 확장될 때 오류를 일으킬 수 있다. 예를 들어 `isdigit(x++)`를 호출하면, 함수였다면 `x`가 한 번만 증가하겠지만, 이 매크로 정의에서는 `x`가 두 번 증가하게 된다.
이 문제를 해결하기 위해 일반적으로 매크로는 테이블 조회를 사용한다. 예를 들어, 표준 라이브러리는 256개의 정수 배열(각 문자 값에 해당)을 제공하고, 각 정수에는 지원되는 분류별 비트 필드가 포함된다. 매크로는 문자 값 인덱스로 해당 정수를 참조하고 관련 비트 필드에 접근한다. 예를 들어, 하위 비트가 숫자인지 여부를 나타낸다면 `isdigit` 매크로는 다음과 같이 작성될 수 있다.
```c
#define isdigit(c) (TABLE[c] & 1)
```
이 방식에서는 매크로 인수 `c`가 한 번만 참조되므로 한 번만 평가된다.
단일 바이트 문자에 대한 함수는 `ctype.h` 헤더 파일(C++에서는 `cctype`)에 정의되어 있다. 와이드 문자에 대한 함수는 `wctype.h` 헤더 파일(C++에서는 `cwctype`)에 정의되어 있다.
문자 분류는 현재 설정된 유효한 로케일에 따라 평가된다.
다음은 C 표준 라이브러리에서 제공하는 주요 문자 분류 및 변환 함수/매크로 목록이다.
바이트 문자 | 와이드 문자 | 설명 |
---|---|---|
`isalnum` | `iswalnum` | 피연산자가 영숫자(알파벳 또는 숫자)인지 확인한다. |
`isalpha` | `iswalpha` | 피연산자가 알파벳 문자인지 확인한다. |
`islower` | `iswlower` | 피연산자가 소문자인지 확인한다. |
`isupper` | `iswupper` | 피연산자가 대문자인지 확인한다. |
`isdigit` | `iswdigit` | 피연산자가 숫자(0-9)인지 확인한다. |
`isxdigit` | `iswxdigit` | 피연산자가 16진수 숫자인지 확인한다. |
`iscntrl` | `iswcntrl` | 피연산자가 제어 문자인지 확인한다. |
`isgraph` | `iswgraph` | 피연산자가 공백 문자를 제외한 출력 가능한 문자인지 확인한다. |
`isspace` | `iswspace` | 피연산자가 공백 문자인지 확인한다. (예: 스페이스, 탭, 개행 문자 등) |
`isblank` | `iswblank` | 피연산자가 단어를 구분하는 데 사용되는 공백 문자(일반적으로 스페이스 또는 탭)인지 확인한다. (C99 표준 이후 추가) |
`isprint` | `iswprint` | 피연산자가 공백 문자를 포함하여 출력 가능한 문자인지 확인한다. |
`ispunct` | `iswpunct` | 피연산자가 구두점 문자인지 확인한다. |
`tolower` | `towlower` | 피연산자를 소문자로 변환한다. |
`toupper` | `towupper` | 피연산자를 대문자로 변환한다. |
해당 없음 | `iswctype` | 피연산자가 특정 속성(로케일 의존적)을 만족하는지 확인한다. |
해당 없음 | `towctrans` | 특정 매핑(로케일 의존적)을 사용하여 피연산자를 변환한다. |
해당 없음 | `wctype` | `iswctype` 함수에서 사용할 와이드 문자 속성을 나타내는 값을 반환한다. |
해당 없음 | `wctrans` | `towctrans` 함수에서 사용할 변환 매핑을 나타내는 값을 반환한다. |
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com