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

C++ 如何在C中识别字符串中包含的数字类型?,c++,c,C++,C,我需要识别字符串中包含的数字类型(整数或浮点)。详细地说,我需要了解可以存储数字的最小类型。我希望无符号类型更适合于正值。也许用一些例子更容易解释: "123" -> unsigned char "-21" -> char "257" -> unsigned short "-271"-> short ... "....." long long "1.2" float "....." double "a" NaN / error 我正在

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

"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())或一些“智能”(基于数学的?、…)以便在开始编码之前易于识别


谢谢。

我先测试一下负片。然后我会寻找一个小数点(和指数表示法)来确定是否使用整数

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

此时,您可以使用位移位或位掩码来检查大小要求。实际上,您希望获取绝对值(对于有符号类型)并检查左侧的零。我将展示unsigned

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" );

对于浮点,您可能希望将该值作为double读入,然后针对FLT_MAX、DBL_MAX等进行测试。

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

在C++术语方面,您可能需要注意。如果您确实对感兴趣的类型有一个优先顺序,您可以按顺序尝试它们,并不断捕获异常,直到其中一个正常工作为止…:-/或者写你自己的等价物

但是,C++的编译性质是这样的,当你到达运行时并有一个输入字符串时,像“代码>自动< /代码>之类的技巧是不可用的。此外,auto并不遵循您的想法,因为它决定“1”的类型为

int

如果您想处理自己的方法,您已经被指向了
limits.h
。但是如果你对C++的习语感兴趣,那么请看我在主题上写的一篇文章:


限制。h
提供整数类型的
*\u MIN
*\u MAX
(即
INT\u MIN
)定义,这可能有助于选择合适的变量。简单。。。不错:)我自己想的更多的是正则表达式之类的东西,但这会起作用:)关于你的第一段,OP说他们更喜欢非负类型的
unsigned
,并给出了
123
被视为
unsigned char
的例子@paddy没有注意到这一点(或者在去寻找链接后忘记了它在那里)…但观察结果更普遍的是,转换计划上可能会有一些总的顺序。我将询问有关该属性的信息。。。