检查TCHAR数组输入是否为带符号整数C++
Check if the TCHAR array input is signed integer C++
我有一个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
的无稽之谈。以前使用它的动机很少,但现在已经不复存在了。
相关文章:
- 检查TCHAR数组输入是否为带符号整数C++
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 为什么乘以常量有符号整数分数没有优化?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 从 std::string 转换为 const 无符号整数
- 带强制转换的无符号/有符号整数加法
- 将fortran生成的二进制文件读取到C++中的带符号整数数组中
- 用于在2个带符号整数区间之间进行除法的C++算法
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- 在c++中通过串行发送一个带符号的整数作为字节,Arduino读取它
- 带无符号整数的模
- 为什么唯一的带符号整数类型会导致clang中的溢出警告
- 使用reinterpret_cast强制转换导致:OverflowError:带符号整数小于最小值
- 如何在C++中安全地比较32位整数和64位整数,以及如何在内部比较带符号整数