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

时间:2018-10-30 10:48:58

标签: c++ tchar

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

TCHAR input[MAX_PATH] = L"12345";

我想检查 input TCHAR数组是否为有效的带符号整数? 这些是它的一些示例,输出应如下所示,

  • L“ 123-”->假
  • L“ 123”-> true
  • L“ abc”->假
  • L“ -123”->是

1 个答案:

答案 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废话。曾经没有多少动力去使用它。