如何识别C中字符串中包含的数字类型
How to recognize the type of number contained in a string in C?
我需要识别字符串中包含的数字类型(整数或浮点)。详细地说,我需要了解可以存储数字的最小类型。我希望无符号类型更适合正数。也许用一些例子来解释更容易:
"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/
- 编译包含字符串的代码时遇到问题
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- C++ 创建包含链表和字符串的对象的链接列表时出错
- C++-字符串是否包含一个带有简单循环的单词
- 编辑字符串以包含括号 c++ 之间的变量
- 使用提升元解析字符串解析包含的文件
- 当字符串包含 %2C 时,在 c++ 中不完整的 std::string
- C++ 检查 UTF8 字符串包含指定的字符
- 将文件作为字符串包含在内
- 为什么string.empty()在字符串包含一个值时评估为true
- boost::p rogram_option::store 在选项字符串包含混合语言字符时引发异常
- 在 c++ 中将字符串(包含字符和浮点数)转换为双精度
- 将字符串(包含数字)转换为整数并返回该整数
- 如果输入字符串包含"%",则vsntprintf_s崩溃
- 当一个字符串包含另一个字符串的一部分时比较字符串
- 如果字符串包含多个 ,如何在每25个换行符( )上分割字符串
- 输出字符串包含奇怪的字符
- 当字符串包含多个NUL字符时,如何获取c_str(用于发送)
- 乘法的字符串[包含整数],输出也存储在字符串中,如何