【发布时间】:2013-01-17 07:41:18
【问题描述】:
场景:我有一个简单的应用程序,它检查它的 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;
};
【问题讨论】:
-
先问一个问题:你为什么将
#define版本作为等号,后跟逗号分隔的整数列表,而网页版中的整数列表是点分隔的?我觉得那里没有任何意义。您可以只使用#define CURRENTVERSION "0.2.5.1"或者更好的const char CURRENTVERSION[] = "0.2.5.1";,因为这里不需要使用宏。 -
@AmadeusHein 您的比较方法不正确。例如,它声称
Version("1.0.0.0")小于Version("0.2.5.1")。在每个if(x < otherVersion.x) return true;之后应该有一个if(otherVersion.x < x) return false;。 -
请不要将您的解决方案放入您的问题中;而是将其添加为答案。添加一个对另一个答案进行改进的答案是可以的。
-
您的解决方案有缺陷。您拥有的代码会尝试从 3.1.2.2 更新到 2.2.2.2,因为例如 minor 是 less 。
标签: c++ parsing version-numbering