如何识别C中字符串中包含的数字类型

How to recognize the type of number contained in a string in C?

本文关键字:字符串 包含 数字 类型 何识别 识别      更新时间:2023-10-16

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

"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())或"smart"(基于数学?,…)之类的东西,以便在我开始编码之前轻松识别。

谢谢。

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

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

此时,您可以使用位偏移或位掩码来检查大小要求。实际上,你想要取绝对值(在有符号类型的情况下),并在左边检查零。我将展示无符号。。。

unsigned long long val;
// ...
if( 0 != (val >> 32) )
printf( "unsigned long longn" );
else if( 0 != (val >> 48) ) 
printf( "unsigned longn" );
else if( 0 != (val >> 56) ) 
printf( "unsigned shortn" );
else
printf( "unsigned charn" );

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

您提到更喜欢先低尺寸,然后无符号。但是,你的类型有一个一致的"等级顺序"吗?我的意思是:有没有一些字符串S1可以从技术上转换成类型X或类型Y并选择X,但有一些字符串S2也可以转换成类型X或类型Y,但选择Y?

就C++术语而言,您可能希望了解"词法转换"。如果你确实对感兴趣的类型有一个优先顺序,你可以按顺序尝试它们,并不断捕捉bad_exical_cast异常,直到其中一个成功为止…:-/或者写你自己的等价物。

但除此之外,C++的编译性质是这样的,当你进入运行时并有了输入字符串时,像auto这样的技巧就不可用了。此外,auto并不遵循您的想法,因为它决定"1"的类型为int

如果你想处理自己的方法,你已经被指向了limits.h。但如果你对惯用的C++感兴趣,那就看看我写的一篇关于这个主题的文章:

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