1

我需要识别字符串中包含的数字类型(整数或浮点数)。详细地说,我需要了解可以存储数字的最小类型。我希望无符号类型更适合正值。也许用一些例子更容易解释:

"123" -> unsigned char

"-21" -> char

"257" -> unsigned short

"-271"-> short

...

"....."  long long

"1.2"    float

"....."  double

"a"      NaN / error

我正在考虑使用 strtoul、strtol、strtod,我想知道是否有一个函数(类似于 is_char()、is_float ()、... 或 num_type ())或一些“智能”(基于数学?,... ) 以便在我开始编码之前轻松识别。

谢谢。

4

2 回答 2

2

我将从测试阴性开始。然后我会寻找一个小数点(和指数符号)来确定是否使用整数。

对于整数,将数字转换为最大的有符号或无符号值(可能是 int64),然后转换回字符串并测试数字是否相同(否则它不能用 int 表示)。

此时,您可以使用位移位或位掩码来检查大小要求。实际上,您希望获取绝对值(在有符号类型的情况下)并检查左侧的零。我将展示未签名的基本思想......

unsigned long long val;
// ...

if( 0 != (val >> 32) )
    printf( "unsigned long long\n" );
else if( 0 != (val >> 48) ) 
    printf( "unsigned long\n" );
else if( 0 != (val >> 56) ) 
    printf( "unsigned short\n" );
else
    printf( "unsigned char\n" );

对于浮点,您可能希望将值作为双精度读入,然后针对 FLT_MAX、DBL_MAX 等进行测试...

于 2012-10-03T02:47:45.910 回答
1

您首先提到更喜欢较小的尺寸,其次是无符号。但是你的类型有一致的“啄食顺序”吗?我的意思是说:是否有一些字符串S1在技术上可以转换为 X 类型或 Y 类型并选择 X,但有些字符串S2也可以转换为 X 类型或 Y 类型,但选择 Y?

C++ 术语方面,您可能想了解“词法转换”。如果您确实有您感兴趣的类型的优先顺序,您可以按顺序尝试它们并继续捕获bad_lexical_cast异常,直到一个工作正常... :-/ 或编写您自己的等价物。

但除此之外,C++ 的编译特性是,当您进入运行时并拥有输入字符串时,诸如此类auto的技巧不可用。此外, auto 不会遵循您的想法,因为它决定“1”的类型是int.

limits.h如果你想解决你自己的方法,你已经被指出来了。但是,如果您对惯用的 C++ 感兴趣,请查看我写的关于该主题的文章:

http://hostilefork.com/2009/03/31/modern_cpp_or_modern_art/

于 2012-10-03T02:50:52.503 回答