我有一个 TCHAR 数组,如下所示,
TCHAR input[MAX_PATH] = L"12345";
我想检查 input TCHAR数组是否为有效的带符号整数? 这些是它的一些示例,输出应如下所示,
答案 0 :(得分:0)
一种明显的可能性是使用正则表达式,其模式类似于-?[0-9]+
。
这可以保证input
仅包含一个可选符号,后跟一些数字-但不能保证数字位数可以适合任何特定大小的整数。如果您的位数超过20位(或大约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
之类的东西。 / p>
顺便说一句:我建议您放下TCHAR
的东西。 Microsoft将其设计为一种编写代码的方式,该代码可以在基于NT的平台(Windows NT / 2k / XP)上使用宽字符,而在基于Windows 95的平台(95/98 / SE / Me)上使用窄字符。后者早已过时,从一开始就消除了使用它的主要原因。
如果您仍然坚持使用它,则必须做一些工作来弥补Microsoft代码的缺点。特别是,尽管他们在tchar.h
中提供了许多字符串操作例程的映射,但他们从未为isdigit
之类的事物提供(或至少记录了)等效物,因此您必须实现自己的:
#ifdef _UNICODE
#define istdigit(c) iswdigit(c)
#else
#define istdigit(c) isdigit(c)
#endif
然后,前面的代码将使用istdigit
宏,而不是isdigit
。
但是如上所述,最好的方法是完全摆脱TCHAR
废话。曾经没有多少动力去使用它。