수색…


스트림에서 읽은 문자 분류

#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 매크로의 값으로 표현 될 것으로 기대합니다.
  • 표현식 *pchar 유형이므로 위의 표현과 일치하도록 변환되어야합니다.
  • char 유형은 signed char 또는 unsigned char signed char 동등하게 정의됩니다.
  • charunsigned charchar 때, char 타입의 모든 가능한 값은 unsigned char 로 표현 될 수 있기 때문에 아무런 문제가 없다.
  • charsigned char 와 동일하면 문자 분류 함수에 전달하기 전에 unsigned char 로 변환해야합니다. 그리고이 변환으로 인해 캐릭터의 가치가 바뀔 수도 있지만, 정확히 이러한 기능이 기대하는 것입니다.
  • 문자 분류 함수의 반환 값은 0 ( false )과 0 (영)을 구별 true . 발생 횟수를 계산하려면이 값을 1 또는 0으로 변환해야합니다.이 값은 이중 부정으로 처리됩니다 !! .

소개

헤더 ctype.h 는 표준 C 라이브러리의 일부입니다. 문자 분류 및 변환 기능을 제공합니다.

이 모든 함수는 하나의 매개 변수를 취합니다. intEOF 이거나 부호없는 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