【问题标题】:Locating doubles in a char array (C++/ROOT)在 char 数组中定位双精度数 (C++/ROOT)
【发布时间】:2020-06-06 10:23:06
【问题描述】:

我已经解析了一些 XML 数据,我想要纬度和经度信息。我需要解析的行是这样的:

trkptlat="60.397015"lon="5.32299"

这是 char 数组中的一个元素,如何将数字提取/解析为双精度数?请注意,数字精度会随着数据的增长而变化,因此我不能仅仅依靠挑选列索引。

【问题讨论】:

  • 对于这种格式不正确的数据,您最好使用正则表达式
  • 您可以在 regex101.com 上尝试正则表达式。这适用于您提供的示例:lat=\"(\d+\.\d+)\"lon=\"(\d+\.\d+)\"
  • 为什么不使用一些现有的 XML 解析器,例如 expatXerces ??
  • 我一般不要求解析 char 数组。我需要在 C++ 中解析它,因为它是我正在编写的程序的一部分。 lon 和 lat 信息是我制作程序所需的最后一部分,但我在解析方面很糟糕。重新表述:如何在 C++ 中解析这些数据,以便只剩下数字?

标签: c++ parsing extract


【解决方案1】:

您正在使用 C 风格的 char 数组作为字符串。所以,我假设你仍然在 C 上。否则,你会std::string。 Ìn C++ 不适合使用 char 数组而不是 std::string

请查看 C-Style 解决方案:

#include <cstring>
#include <cstdlib>
#include <cstdio>

int main() {

    char data[] = "SomeTrashMoreTrashtrkptlat=\"60.397015\"lon=\"5.32299\"MoreTrashMoreTrash";

    char firstDoubleIndicator[] = "trkptlat=\"";
    char secondDoubleIndicator[] = "\"lon=\"";

    double latitude = 0;
    double longitude = 0;

    char* startPosition = strstr(data, firstDoubleIndicator);
    if (startPosition) {
        latitude = std::atof(startPosition + std::strlen(firstDoubleIndicator));
    }
    startPosition = strstr(data, secondDoubleIndicator);
    if (startPosition) {
        longitude = std::atof(startPosition + std::strlen(secondDoubleIndicator));
    }
    std::printf("\nlatitude:\t%f\nlongitude:\t%f\n\n", latitude, longitude);
    return 0;
}

【讨论】:

  • 好答案,绝对是解决方案!快速说明:我不完全理解 if 语句,以及它如何提取正确的双精度值......你能提供一些快速文档吗?
【解决方案2】:

这可以通过多种方式完成,提前警告完全未经测试的代码

使用安全版本的 sscan 和类似这样的参数

"\"trkptlat=\"%d\"lon=\"%d\""

请务必检查返回值的长度和错误。

使用带数字和点的 std::find_first_of

auto start = find_first_of (haystack.begin(), haystack.end(), digits.begin(), digit.end());
auto end = find_first_of (it, haystack.end(), digitsdot.begin(), digitdot.end(), 
 [](char a, char b){ return a != b; });
double lat = atof(start); // somewhere there might be a version that returns how many chars read also.
// check for errors
etc.

进一步查看http://www.cplusplus.com/reference/algorithm/find_first_of/

如果你是信任的人,你可以采取一些你知道的捷径

"trkptlat="

将被添加,因此您可以从

开始
auto start = haystack+preLen;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 2013-04-05
    • 2011-01-22
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多