一个明显的可能性是使用正则表达式,其模式类似于-?[0-9]+。
这保证input 只包含一个可选的符号,后跟一些数字——但不保证数字的数量适合任何特定大小的整数。如果您有超过 20 位(或更多)数字,则很有可能您的编译器不会提供能够容纳它的整数类型(即使从数学角度来看,字符串的内容仍然是有效的整数)。
当然,你也可以使用更手动的方法:
bool is_int(char const *input) {
auto first = input;
// check for leading minus sign
if (*first == '-')
++first;
// then check for digits:
for ( ; *first && isdigit(*first); ++first)
;
return *first == '\0';
}
如果您想确保input 的内容实际上可以转换为int(由目标平台定义),您可以使用std::stoi 之类的东西。
顺便说一句:我建议放弃TCHAR 的东西。微软将其设计为一种编写代码的方式,可以在基于 NT 的平台 (Windows NT/2k/XP) 上使用宽字符,在基于 Windows 95 的平台 (95/98/SE/Me) 上使用窄字符。后者早已过时,首先消除了使用它的主要原因。
如果你真的坚持使用它,你将不得不做一些工作来弥补微软代码的缺点。特别是,虽然他们在 tchar.h 中为相当多的字符串操作例程提供了映射,但他们从未提供(或至少记录在案)类似 isdigit 的等价物,因此您必须实现自己的:
#ifdef _UNICODE
#define istdigit(c) iswdigit(c)
#else
#define istdigit(c) isdigit(c)
#endif
那么前面的代码将使用istdigit宏而不是isdigit。
但如前所述,最好的方法是完全摆脱 TCHAR 的废话。曾经有过使用它的小动机早已不复存在。