在查std::ios::sync_with_stdio(false);有关信息时,看到https://blog.csdn.net/qq_33583069/article/details/53086992 这篇博客,对其中一些问题比较感兴趣,整理了下相关资料:
- isdigit()
https://blog.csdn.net/cupidove/article/details/43271579这里他有些信息不是很详细,代码中加了一些注释,这种写法类似Linux内核中有关此函数的实现,在原有基础上加了一些其他功能的扩展,可以看我的注释。
#include <time.h>
#include <iostream>
#include <windows.h>using namespace std;// 关闭 IO 同步
static const auto io_sync_off = []()
{// turn off syncstd::ios::sync_with_stdio(false);// untie in/out streamsstd::cin.tie(nullptr);return nullptr;
}();#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 16/10进制数 */
#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) // alpha + digit 字母和数字
#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) // 16/10进制
#define itest_tolower(c) (itest_isupper((c)) ? ((c) + 'a' - 'A') : (c)) // 转小写(如果可以)
#define itest_toupper(c) (itest_islower((c)) ? ((c) + 'A' - 'a') : (c)) // 转大写(如果可以)int main()
{const char* demo_string = "abcd123AB 2";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);}}}return 0;
}
其中还涉及到了正则表达式的一些知识:http://baiy.cn/utils/_regex_doc/index.htm
ASCII标准表 :https://baike.baidu.com/item/ASCII
- max()/min()
https://blog.csdn.net/a_ran/article/details/74911031
https://www.iteblog.com/archives/237.html
- unique()/lower_bound()/upper_bound()
https://blog.csdn.net/sicofield/article/details/8740141
https://blog.csdn.net/Xiaohei00000/article/details/51010292
- scanf()/printf()
https://wu-yudong.iteye.com/blog/1974368
- cin/cout
https://blog.csdn.net/YinJianxiang/article/details/76436089
https://www.cnblogs.com/ncgds/p/5759551.html
尾递归优化:
http://www.ruanyifeng.com/blog/2015/04/tail-call.html
http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html