【问题标题】:Determine the Type of a value based on a string representation of the value?根据值的字符串表示确定值的类型?
【发布时间】:2012-08-03 02:24:31
【问题描述】:

我想编写一个 YAML 阅读器,它必须执行的一项更基本的职责是通过单独查看条目的字符串来确定条目的类型。 (有一些方法可以显式声明类型,但隐式类型是 YAML 最吸引人的特性之一)

基本上,我要注意的类型是整数、浮点数、字符串、布尔值 true/false 和 null(由空字段表示)

字符串,真/假,空,这些很容易检测。但是整数和尤其是浮点数给我带来了麻烦,只是它们可以并且通常以多少不同的方式书写(浮点数有时以科学记数法表示,整数以十六进制表示,等等)。

我的问题:在 C++ 中,什么是识别浮点数或整数的好方法,从可以轻松表示包含数字的字符串的字段并将其转换为字符串表示成合适的值?

浮点数可以采用的格式(可能不是详尽的列表)是:

0.0
0.0f
0.f
0.
+0.0
-0.0e+413

虽然整数会采用以下形式:

99    // decimal
077   // octal
0xFF  // hex
-10
+10

【问题讨论】:

  • 您想从头开始还是使用库?
  • 如果你的编译器是 C++11 兼容的,它有正则表达式。使用这些来做你要求的事情会很容易(如果你对正则表达式有一些基本的了解)。
  • @Sharpie - 如果可能,没有库。我查看了正则表达式标题,它似乎也只是答案!但是...我对正则表达式的掌握是脆弱的。
  • 我建议你搜索 SO 来解析东西,对不起,我不是专家,但你真的应该对正则表达式有一些概念,我发誓它非常有用!!跨度>
  • 看起来所有浮点数,只有浮点数包含.。这很简单。所有十六进制常量,只有十六进制常量以0x 开头。所有八进制常量,只有八进制常量以0[0-7] 开头。其他任何东西都是十进制的。真的那么简单吗?

标签: c++ string


【解决方案1】:

我建议使用新的 C++11 regular expression functionality,但警告说并非所有编译器都完全支持这一点。 Visual Studio 2010 支持,而 GCC 仅部分支持。

另一种方法是读取分隔符之间的文本,以便获得值的全文。然后检查它是字符串还是布尔值,如果不是,则使用例如strtod 函数尝试将其转换为浮点数,如果失败(请参阅有关如何检测此问题的手册页)使用 strtol 尝试将其解析为整数。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2011-04-30
    • 2018-10-18
    • 2021-03-19
    • 2012-08-15
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多