2

シナリオ: RSS フィードをチェックし、利用可能な新しいバージョンがあるかどうかを調べる単純なアプリケーションがあります。したがって、現在のバージョンが RSS フィードにあるバージョンよりも古いかどうかを確認したいと思います。理想的には次のように単純です。

CURRENTVERSION < updateVersion

問題:バージョニングは major.minor.revision.build で構成されていますが、これを解析してバージョン チェックを実行する方法がわかりません。

比較するパラメータは次のとおりです。

#define CURRENTVERSION = 0,2,5,1

Web からダウンロードしたバージョンは"0.2.6.1"(文字列として) です。

一方が他方よりも小さいかどうかを確認する最良の方法は何でしょうか?

double に変換してみましたが、値は 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

バージョン番号を表す2つの文字列を引数とする関数を使用することをお勧めします。このような単純なことを行うために構造体やクラスを使用する必要はありません。物事をシンプルに保つ方が良いと思います。例えば:

#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 に答える