版本號大小比較算法

版本號大小比較算法

版本號之間比較大小,本質上是比較字符串之間的關係。這裏給定兩個版本號,你必定能迅速地區分出大小:算法

0.0.2
0.0.3

想要讓計算機程序分辨她們的關係,能夠直接使用strcmp()函數獲取返回值,若是你在 iOS 系統下編程,也能夠使用 NSString 類提供的- (NSComparisonResult)compare:(NSNumber *)decimalNumber方法。編程

但若是版本進化成下面這樣,上面所說的 API 必定會產生錯誤的結果。函數

2.7.14.2345
2.12.8.1234

由於單純的字符串比較大小的依據是每一個字符的 ASCII 碼。程序會認爲字符7比字符1大,結果就是第一個版本號大於第二個版本號,這是錯誤的。spa

所以在識別以前,有必要了解一下版本號的組成部分,以及每個數字的意義,這裏已 GUN 風格的版本號做爲說明。code

版本號大體如下幾個部分組成:ci

  • 主版本號
  • 次版本號
  • 修正版本號
  • 編譯版本號

示例: 3.5.20.9527字符串

在比較版本號時,正確的作法應該是,主版本號和主版本號比較,次版本號和次版本號比較等等。因此算法的核心應該是分離出版本號的各個組成部分。由此產生的算法會有多種。這裏列舉一個方式最簡單粗暴的 C 語言代碼:io

/**
 * 比較版本號
 *
 * @param v1 第一個版本號
 * @param v2 第二個版本號
 *
 * @return 若是版本號相等,返回 0,
 *         若是第一個版本號低於第二個,返回 -1,不然返回 1.
 */
int compare_version(const char *v1, const char *v2)
{
    assert(v1);
    assert(v2);
    const char *p_v1 = v1;
    const char *p_v2 = v2;

    while (*p_v1 && *p_v2) {
        char buf_v1[16] = {0};
        char buf_v2[16] = {0};

        char *i_v1 = strchr(p_v1, '.');
        if (i_v1 != p_v1) {
            if (!i_v1) break;
            strncpy(buf_v1, p_v1, i_v1 - p_v1);
            p_v1 = i_v1;
        }
        else
            p_v1++;

        char *i_v2 = strchr(p_v2, '.');
        if (i_v2 != p_v2) {
            if (!i_v2) break;
            strncpy(buf_v2, p_v2, i_v2 - p_v2);
            p_v2 = i_v2;
        }
        else
            p_v2++;

        int order = atoi(buf_v1) - atoi(buf_v2);
        if (order != 0)
            return order < 0 ? -1 : 1;
    }

    if (*p_v1 || *p_v2)
        return (atof(p_v1) - atof(p_v2)) < 0 ? -1 : 1;
    return 0;
}
相關文章
相關標籤/搜索