现在的位置: 首页 > 综合 > 正文

实现isdigit

2018年05月08日 ⁄ 综合 ⁄ 共 4004字 ⁄ 字号 评论关闭
#define _ITEST_U	0x01	/* upper */
#define _ITEST_L	0x02	/* lower */
#define _ITEST_D	0x04	/* digit */
#define _ITEST_C	0x08	/* cntrl */
#define _ITEST_P	0x10	/* punct */
#define _ITEST_S	0x20	/* white space (space/lf/tab) */
#define _ITEST_X	0x40	/* hex digit */
#define _ITEST_SP	0x80	/* hard space (0x20) */

const unsigned char itest_ctype[] = {
	_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 0-7 */
	_ITEST_C, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C|_ITEST_S, _ITEST_C,
	_ITEST_C,	/* 8-15 */
	_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 16-23 */
	_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,_ITEST_C,			/* 24-31 */
	_ITEST_S|_ITEST_SP,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,		/* 32-39 */
	_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 40-47 */
	_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,_ITEST_D,			/* 48-55 */
	_ITEST_D,_ITEST_D,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 56-63 */
	_ITEST_P, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X, _ITEST_U|_ITEST_X,
	_ITEST_U|_ITEST_X, _ITEST_U, /* 64-71 */
	_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,			/* 72-79 */
	_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_U,			/* 80-87 */
	_ITEST_U,_ITEST_U,_ITEST_U,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,			/* 88-95 */
	_ITEST_P, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X, _ITEST_L|_ITEST_X,
	_ITEST_L|_ITEST_X, _ITEST_L, /* 96-103 */
	_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 104-111 */
	_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_L, /* 112-119 */
	_ITEST_L,_ITEST_L,_ITEST_L,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_P,_ITEST_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 */
	_ITEST_S|_ITEST_SP, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,
	_ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,	/* 160-175 */
	_ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,
	_ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P, _ITEST_P,	/* 176-191 */
	_ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U,
	_ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U,	/* 192-207 */
	_ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_P, _ITEST_U, _ITEST_U, _ITEST_U,
	_ITEST_U, _ITEST_U, _ITEST_U, _ITEST_U, _ITEST_L,	/* 208-223 */
	_ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L,
	_ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L,	/* 224-239 */
	_ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_P, _ITEST_L, _ITEST_L, _ITEST_L,
	_ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L, _ITEST_L /* 240-255 */
};

#define itest_ismask(x)	(itest_ctype[(int)(unsigned char)(x)])

#define itest_isalnum(c)	((itest_ismask(c)&(_ITEST_U|_ITEST_L|_ITEST_D)) != 0)
#define itest_isalpha(c)	((itest_ismask(c)&(_ITEST_U|_ITEST_L)) != 0)
#define itest_iscntrl(c)	((itest_ismask(c)&(_ITEST_C)) != 0)
#define itest_isdigit(c)	((itest_ismask(c)&(_ITEST_D)) != 0)
#define itest_isgraph(c)	((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D)) != 0)
#define itest_islower(c)	((itest_ismask(c)&(_ITEST_L)) != 0)
#define itest_isprint(c)	((itest_ismask(c)&(_ITEST_P|_ITEST_U|_ITEST_L|_ITEST_D|_ITEST_SP)) != 0)
#define itest_ispunct(c)	((itest_ismask(c)&(_ITEST_P)) != 0)
#define itest_isspace(c)	((itest_ismask(c)&(_ITEST_S)) != 0)
#define itest_isupper(c)	((itest_ismask(c)&(_ITEST_U)) != 0)
#define itest_isxdigit(c)	((itest_ismask(c)&(_ITEST_D|_ITEST_X)) != 0)
#define itest_tolower(c)	(itest_isupper((c)) ? ((c) + 'a' - 'A') : (c))
#define itest_toupper(c)	(itest_islower((c)) ? ((c) + 'A' - 'a') : (c))

int main(int argc, char** argv)
{
    const char* demo_string = "abcd123AB";
    char* ptr = (char*)demo_string;
    for (int i = 0; i < strlen(demo_string); i++,ptr++)
	{
		if (itest_isdigit(*ptr))
		{
			printf("%c is digit\n",*ptr);
		}
		else if (itest_isprint(*ptr))
		{
			if (itest_islower(*ptr))
			{
				printf("%c is lower\n",*ptr);
			}
			else if (itest_isupper(*ptr))
			{
				printf("%c is isupper\n",*ptr);
			}
		}
	}
}

抱歉!评论已关闭.