isdigit () 최고급 실현
표준 C 에서 함수 int isdigit (int c) 가 문자 c 가 0 ~ 9 사이 의 숫자 인지 판단 할 수 있다 는 것 을 알 고 있 습 니 다.예 를 들 면:
int a = isdigit('1'); //a == 1
int b = isdigit('a'); //b == 0
int c = isdigit(3); //c == 0
isdigit 의 용 도 를 알 게 되면 우 리 는 문 제 를 던 질 수 있 습 니 다.
당신 은 어떻게 isdigit (int c) 를 실현 할 것 입 니까?
나 는 절대 다수의 사람들의 첫 번 째 반응 과 최종 생각 은 모두 매크로 정 의 를 사용 하여 이 간단 한 함 수 를 실현 하 는 것 이 라 고 생각한다. 다음 과 같다.
#define isdigit(c) ((c) >= '0' && (c) <= '9')
간결 하고 아름 답 습 니 다. 매크로 를 사용 하면 함수 호출 비용 도 절약 되 고 효율 도 떨 어 지지 않 습 니 다. 이것 이 가장 완벽 한 것 입 니까?Liux 커 널 에서 이 함 수 를 어떻게 실현 하 는 지 보 여 줍 니 다.
#define _U 0x01 /* upper */
#define _L 0x02 /* lower */
#define _D 0x04 /* digit */
#define _C 0x08 /* cntrl */
#define _P 0x10 /* punct */
#define _S 0x20 /* white space (space/lf/tab) */
#define _X 0x40 /* hex digit */
#define _SP 0x80 /* hard space (0x20) */
extern unsigned char _ctype[];
#define isdigit(c) ((_ctype+1)[c]&(_D))
unsigned char _ctype[] = {0x00, /* EOF */
_C,_C,_C,_C,_C,_C,_C,_C, /* 0-7 */
_C,_C|_S,_C|_S,_C|_S,_C|_S,_C|_S,_C,_C, /* 8-15 */
_C,_C,_C,_C,_C,_C,_C,_C, /* 16-23 */
_C,_C,_C,_C,_C,_C,_C,_C, /* 24-31 */
_S|_SP,_P,_P,_P,_P,_P,_P,_P, /* 32-39 */
_P,_P,_P,_P,_P,_P,_P,_P, /* 40-47 */
_D,_D,_D,_D,_D,_D,_D,_D, /* 48-55 */
_D,_D,_P,_P,_P,_P,_P,_P, /* 56-63 */
_P,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U|_X,_U, /* 64-71 */
_U,_U,_U,_U,_U,_U,_U,_U, /* 72-79 */
_U,_U,_U,_U,_U,_U,_U,_U, /* 80-87 */
_U,_U,_U,_P,_P,_P,_P,_P, /* 88-95 */
_P,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L|_X,_L, /* 96-103 */
_L,_L,_L,_L,_L,_L,_L,_L, /* 104-111 */
_L,_L,_L,_L,_L,_L,_L,_L, /* 112-119 */
_L,_L,_L,_P,_P,_P,_P,_C, /* 120-127 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 128-143 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-159 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 160-175 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 176-191 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 192-207 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 208-223 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 224-239 */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; /* 240-255 */
신기 하 죠? 전형 적 인 공간 을 시간 으로 바 꾸 는 방법.여기 서 간단 한 설명 을 하 겠 습 니 다. 우 리 는 문자 '0' ~ '9' 에 대응 하 는 ASCII 코드 가 48 ~ 57 이 고 위 에 비 친 을 알 고 있 습 니 다.ctype 배열 의 해당 위 치 는 모두D,_D&_D 는 진실 이기 때문에 '0' ~ '9' 에 대해 정확 한 판단 을 할 수 있다.나머지 는 이 범위 밖의 문 자 를 false 로 판단 하면 됩 니 다.여기 서 의 방법 이 정 수 된 점 은 바로 여기에 있다. 서로 다른 종류의 문 자 를 분류 하고 유일한 바 이 너 리 로 표 지 를 한다. 사용 & | 은 서로 다른 유형의 문자 가 두 가지 분류의 조건 을 동시에 만족 시 키 지 않도록 확보한다.
글 끝 에 한 마디 하 자 면 시간 이 있 으 면 Liux 커 널 의 코드 를 많이 보 세 요. 왜냐하면 모두 여러 번 단련 된 것 입 니 다.아마도 많은 코드 가 당신 을 괴상 하 게 만 들 었 을 것 입 니 다. 그러나 hack 가 생각 을 내 놓 은 후에 얻 은 기쁨 도 말로 표현 할 수 없습니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
검 지 Offer - 009 - 피 보 나치 수열행렬 {1, 1, 1, 0} 의 n - 1 차방 결과 의 첫 번 째 줄 은 f (n) 이기 때 문 입 니 다.이 수학 공식 은 수학 귀납법 으로 증명 하기 어렵 지 않다.관심 있 는 친 구 는 스스로 증명 해도 무방...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.