首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解析版本号来比较?

如何解析版本号来比较?
EN

Stack Overflow用户
提问于 2013-01-17 07:41:18
回答 3查看 12.9K关注 0票数 2

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

代码语言:javascript
运行
复制
CURRENTVERSION < updateVersion

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

以下是要比较的参数:

代码语言:javascript
运行
复制
#define CURRENTVERSION = 0,2,5,1

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

什么是检查一个比另一个少的最好的方法?

我尝试过将它转换为一个双值,但是值变为0.2 (只是第一个)。正在被解析,rest被忽略)。

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

(编辑)--由于Karthik的回答,我选择了下面的解决方案。

代码语言:javascript
运行
复制
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;
};
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-17 07:46:02

代码语言:javascript
运行
复制
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 *

代码语言:javascript
运行
复制
#define CURRENTVERSION "0.2.5.1"

您可以使用斯堪夫或类似于斯特托克的东西在构造函数中进行解析。

票数 10
EN

Stack Overflow用户

发布于 2013-01-17 08:01:20

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

代码语言:javascript
运行
复制
#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"));
}
票数 9
EN

Stack Overflow用户

发布于 2019-02-13 11:06:36

如果您有一个支持C++11的编译器,您可以通过std::tuple使代码更加简洁:

代码语言:javascript
运行
复制
 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();
  }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14374272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档