检查TCHAR数组输入是否为带符号整数C++

Check if the TCHAR array input is signed integer C++

本文关键字:带符号 整数 C++ 是否 TCHAR 数组 输入 检查      更新时间:2023-10-16

我有一个TCHAR数组,如下所示,

TCHAR input[MAX_PATH] = L"12345";

我想检查输入TCHAR数组是否是有效的有符号整数?这些是它的一些例子,输出应该如下,

  • L"123-"->错误
  • L"123"->true
  • L"abc"->错误
  • L"-123"->true

一种明显的可能性是使用正则表达式,其模式类似于-?[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 == '';
}

如果您想确保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的无稽之谈。以前使用它的动机很少,但现在已经不复存在了。