场景:,我有一个简单的应用程序,可以检查它的RSS,并查看是否有新版本可用。因此,我想检查当前版本是否小于RSS提要上的版本。理想情况下,只需:
CURRENTVERSION < updateVersion
问题:版本控制由major.minor.revision.build组成,我不知道如何将其解析为一个数字来执行版本检查。
以下是要比较的参数:
#define CURRENTVERSION = 0,2,5,1
从网络下载的版本是"0.2.6.1"
(作为字符串)。
什么是检查一个比另一个少的最好的方法?
我尝试过将它转换为一个双值,但是值变为0.2 (只是第一个)。正在被解析,rest被忽略)。
约束:--它不能是使用.NET库的解决方案,因为应用程序必须在没有.NET框架的情况下工作。
(编辑)--由于Karthik的回答,我选择了下面的解决方案。
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;
};
发布于 2013-01-17 07:46:02
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 *
。
#define CURRENTVERSION "0.2.5.1"
发布于 2013-01-17 08:01:20
我建议只使用一个函数,其参数是两个字符串,表示版本号。没有必要使用结构或类来做这样简单的事情。我认为保持简单更好。例如:
#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"));
}
发布于 2019-02-13 11:06:36
如果您有一个支持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();
}
https://stackoverflow.com/questions/14374272
复制相似问题