【问题标题】:Check if the TCHAR array input is signed integer C++检查 TCHAR 数组输入是否为有符号整数 C++
【发布时间】:2018-10-30 10:48:58
【问题描述】:

我有一个 TCHAR 数组如下,

TCHAR input[MAX_PATH] = L"12345";

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

  • L"123-" -> 错误
  • L"123" -> 是的
  • L"abc" -> 错误
  • L"-123" -> 真

【问题讨论】:

  • Locale 是一个雷区,中东的会计师和人认为“123-”是一个完全合理的数字。只需convert the string。如果您绝对必须使用 tchar(不要),请使用 _tcstol

标签: c++ tchar


【解决方案1】:

一个明显的可能性是使用正则表达式,其模式类似于-?[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 的废话。曾经有过使用它的小动机早已不复存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-19
    • 2015-04-12
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多