C Language
- 문자 분류 및 변환
수색…
스트림에서 읽은 문자 분류
#include <ctype.h>
#include <stdio.h>
typedef struct {
size_t space;
size_t alnum;
size_t punct;
} chartypes;
chartypes classify(FILE *f) {
chartypes types = { 0, 0, 0 };
int ch;
while ((ch = fgetc(f)) != EOF) {
types.space += !!isspace(ch);
types.alnum += !!isalnum(ch);
types.punct += !!ispunct(ch);
}
return types;
}
classify
함수는 스트림에서 문자를 읽고 공백, 영숫자 및 구두점 문자의 수를 계산합니다. 여러 가지 함정을 피할 수 있습니다.
- 스트림에서 문자를 읽을 때 결과는
int
로 저장됩니다. 그렇지 않으면EOF
(파일 끝 마커)와 동일한 비트 패턴을 갖는 문자 사이에 모호성이 있기 때문입니다. - 문자 분류 함수 (예 :
isspace
)는 인수가unsigned char
또는EOF
매크로의 값으로 표현 될 것으로 기대합니다. 이것이 바로fgetc
반환하는fgetc
때문에 여기에서는 변환 할 필요가 없습니다. - 문자 분류 함수의 반환 값은 0 (
false
)과 0 (영)을 구별true
. 발생 횟수를 계산하려면이 값을 1 또는 0으로 변환해야합니다.이 값은 이중 부정으로 처리됩니다!!
.
문자열에서 문자 분류하기
#include <ctype.h>
#include <stddef.h>
typedef struct {
size_t space;
size_t alnum;
size_t punct;
} chartypes;
chartypes classify(const char *s) {
chartypes types = { 0, 0, 0 };
const char *p;
for (p= s; p != '\0'; p++) {
types.space += !!isspace((unsigned char)*p);
types.alnum += !!isalnum((unsigned char)*p);
types.punct += !!ispunct((unsigned char)*p);
}
return types;
}
classify
함수는 문자열의 모든 문자를 검사하고 공백, 영숫자 및 구두점 문자의 수를 계산합니다. 여러 가지 함정을 피할 수 있습니다.
- 문자 분류 함수 (예 :
isspace
)는 인수가unsigned char
또는EOF
매크로의 값으로 표현 될 것으로 기대합니다. - 표현식
*p
는char
유형이므로 위의 표현과 일치하도록 변환되어야합니다. -
char
유형은signed char
또는unsigned char
signed char
동등하게 정의됩니다. -
char
이unsigned char
와char
때,char
타입의 모든 가능한 값은unsigned char
로 표현 될 수 있기 때문에 아무런 문제가 없다. -
char
가signed char
와 동일하면 문자 분류 함수에 전달하기 전에unsigned char
로 변환해야합니다. 그리고이 변환으로 인해 캐릭터의 가치가 바뀔 수도 있지만, 정확히 이러한 기능이 기대하는 것입니다. - 문자 분류 함수의 반환 값은 0 (
false
)과 0 (영)을 구별true
. 발생 횟수를 계산하려면이 값을 1 또는 0으로 변환해야합니다.이 값은 이중 부정으로 처리됩니다!!
.
소개
헤더 ctype.h
는 표준 C 라이브러리의 일부입니다. 문자 분류 및 변환 기능을 제공합니다.
이 모든 함수는 하나의 매개 변수를 취합니다. int
는 EOF 이거나 부호없는 char로 나타낼 수 있어야합니다.
분류 함수의 이름 앞에는 'is'가 붙습니다. 전달 된 문자가 관련 조건을 만족하면 각각은 정수가 아닌 값 (TRUE)을 반환합니다. 조건이 충족되지 않으면 함수는 0 값 (FALSE)을 반환합니다.
이러한 분류 함수는 다음과 같이 작동하며 기본 C 로켈을 가정합니다.
int a;
int c = 'A';
a = isalpha(c); /* Checks if c is alphabetic (A-Z, a-z), returns non-zero here. */
a = isalnum(c); /* Checks if c is alphanumeric (A-Z, a-z, 0-9), returns non-zero here. */
a = iscntrl(c); /* Checks is c is a control character (0x00-0x1F, 0x7F), returns zero here. */
a = isdigit(c); /* Checks if c is a digit (0-9), returns zero here. */
a = isgraph(c); /* Checks if c has a graphical representation (any printing character except space), returns non-zero here. */
a = islower(c); /* Checks if c is a lower-case letter (a-z), returns zero here. */
a = isprint(c); /* Checks if c is any printable character (including space), returns non-zero here. */
a = isupper(c); /* Checks if c is a upper-case letter (a-z), returns zero here. */
a = ispunct(c); /* Checks if c is a punctuation character, returns zero here. */
a = isspace(c); /* Checks if c is a white-space character, returns zero here. */
a = isupper(c); /* Checks if c is an upper-case letter (A-Z), returns non-zero here. */
a = isxdigit(c); /* Checks if c is a hexadecimal digit (A-F, a-f, 0-9), returns non-zero here. */
C99
a = isblank(c); /* Checks if c is a blank character (space or tab), returns non-zero here. */
두 가지 변환 기능이 있습니다. 이들은 접두사 'to'를 사용하여 명명됩니다. 이 함수는 위의 인수와 동일한 인수를 사용합니다. 그러나 반환 값은 단순한 0 또는 0이 아닌 전달 된 인수가 어떤 방식으로 변경되었습니다.
이러한 변환 함수는 다음과 같이 작동하며 기본 C 로켈을 가정합니다.
int a;
int c = 'A';
/* Converts c to a lower-case letter (a-z).
* If conversion is not possible the unchanged value is returned.
* Returns 'a' here.
*/
a = tolower(c);
/* Converts c to an upper-case letter (A-Z).
* If conversion is not possible the unchanged value is returned.
* Returns 'A' here.
*/
a = toupper(c);
다음 정보는 cplusplus.com 에서 원래 127 문자 ASCII 세트가 각 유형별 분류 함수에 의해 어떻게 고려되는지 (a는 해당 문자에 대해 0이 아닌 값을 반환 함을 나타냄) 매핑됩니다.
ASCII 값 | 문자들 | iscntrl | isblank | 공간 | 이쑤시개 | 등기구 | 이소 알파 | isdigit | isxdigit | 이딸 눔 | ispunct | 상도 | isprint |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 .. 0x08 | NUL (기타 제어 코드) | • | |||||||||||
0x09 | 탭 ( '\ t') | • | • | • | |||||||||
0x0A .. 0x0D | (공백 제어 코드 : '\ f', '\ v', '\ n', '\ r') | • | • | ||||||||||
0x0E .. 0x1F | (다른 제어 코드들) | • | |||||||||||
0x20 | 공백 ( '') | • | • | • | |||||||||
0x21 .. 0x2F | ! "# $ % & '() * +, -. / | • | • | • | |||||||||
0x30 .. 0x39 | 0123456789 | • | • | • | • | • | |||||||
0x3a .. 0x40 | :; <=>? @ | • | • | • | |||||||||
0x41 .. 0x46 | ABCDEF | • | • | • | • | • | • | ||||||
0x47 .. 0x5A | GHIJKLMNOPQRSTUVWXYZ | • | • | • | • | • | |||||||
0x5B .. 0x60 | [] ^ _` | • | • | • | |||||||||
0x61 .. 0x66 | abcdef | • | • | • | • | • | • | ||||||
0x67 .. 0x7A | ㅁㅁ | • | • | • | • | • | |||||||
0x7B .. 0x7E | {} ~ 막대 | • | • | • | |||||||||
0x7F | (DEL) | • |
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow