2

场景:我有一个简单的应用程序,它检查它的 RSS 提要并查看是否有更新的版本可用。因此,我想检查当前版本是否低于 RSS 提要中的版本。理想情况下很简单:

CURRENTVERSION < updateVersion

问题:版本控制由major.minor.revision.build 组成,我不知道如何将其解析为数字来执行版本检查。

这些是要比较的参数:

#define CURRENTVERSION = 0,2,5,1

从网上下载的版本是"0.2.6.1"(作为字符串)。

检查一个是否小于另一个的最佳方法是什么?

我尝试将其转换为双精度值,但值变为 0.2(仅解析第一个 . ,忽略其余部分)。

约束:它不能是使用 .NET 库的解决方案,因为应用程序必须在没有 .NET 框架的情况下工作。

(编辑)感谢 Karthik T 的回答,我选择了以下解决方案。

struct Version
{
    Version(string versionStr)
    {
        sscanf(versionStr.c_str(), "%d.%d.%d.%d", &major, &minor, &revision, &build);
    }

    bool operator<(const Version &otherVersion)
    {
        if(major < otherVersion.major)
            return true;
        if(minor < otherVersion.minor)
            return true;
        if(revision < otherVersion.revision)
            return true;
        if(build < otherVersion.build)
            return true;
        return false;
    }

    int major, minor, revision, build;
};
4

3 回答 3

10
struct Version{
    Version(std::string versionStr);     //remember to use  versionStr.c_str() if using C functions like sscanf or strtok
    bool operator<(const Version &other); // could and perhaps should be a free function

    int major,minor,revision,build;
};


bool needtoUpdate = Version(CURRENTVERSION)<Version(latestVersion);

请填写定义。

另外,你#define是一个错误。你想要它像下面。或者,const char *如果可以,请使用 a。

#define CURRENTVERSION "0.2.5.1"

您可以使用sscanf或类似strtok的东西在构造函数中进行解析。

于 2013-01-17T07:46:02.057 回答
9

我建议只使用一个函数,其参数是两个字符串,代表版本号。没有必要使用结构或类来做这么简单的事情。我认为最好保持简单。例如:

#include <stdio.h>
#include <string.h>

/*
 * return 1 if v1 > v2
 * return 0 if v1 = v2
 * return -1 if v1 < v2
 */

int cmpVersion(const char *v1, const char *v2)
{
    int i;
    int oct_v1[4], oct_v2[4];
    sscanf(v1, "%d.%d.%d.%d", &oct_v1[0], &oct_v1[1], &oct_v1[2], &oct_v1[3]);
    sscanf(v2, "%d.%d.%d.%d", &oct_v2[0], &oct_v2[1], &oct_v2[2], &oct_v2[3]);

    for (i = 0; i < 4; i++) {
        if (oct_v1[i] > oct_v2[i])
            return 1;
        else if (oct_v1[i] < oct_v2[i])
            return -1;
    }

    return 0;
}

int main()
{
    printf("%d\n", cmpVersion("0.1.2.3", "0.2.3.4"));
}
于 2013-01-17T08:01:20.110 回答
2

如果你有一个支持C++11的编译器,你可以std::tuple让代码更干净:

 struct Version
  {
      Version(std::string versionStr)
      {
          sscanf(versionStr.c_str(), "%d.%d.%d.%d", &major, &minor, &revision, &build);
      }
      VersionTuple ToTuple() const
      {
          return VersionTuple{ major,minor,revision,build };
      }
      int major, minor, revision, build;
  };

  bool operator<(const Version& v1, const Version& v2)
  {
      return v1.ToTuple() < v2.ToTuple();
  }
于 2019-02-13T11:06:36.530 回答