2016-08-12 48 views
-7

比方说,我有一个字符串(Java版本字符串)是这样的: “1.8.0_101” “1.8.0_91”如何比较C++中的java版本字符串?

有一种简单的方法来确定哪个版本的C/C++高?

我已经使用strcmp()到目前为止。它正确地比较版本字符串,如“1.7.0”和“1.8.0”,但是当涉及下划线字符时,它不再起作用(因为下划线在ASCII表中的值高于所有数字)

+5

你到目前为止尝试过什么?这是如何工作的? *如何*没有工作?你知道[如何提出好问题](http://stackoverflow.com/help/how-to-ask)这里在stackoverflow?以及如何创建[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)? –

+0

将数字推到两个向量上,比较向量。投票结束**太广泛**。 –

+1

这实际上与Java没有任何关系;它只是一个C++字符串解析练习。请学会提取不相关的技术;它会帮助你进行研究,然后你甚至不需要问。 –

回答

1

声明:应该只是一个例子,给你一个实现的想法。你的问题缺乏各种观点,以使它成为一个很好的问题,无论如何,我将尽力帮助并给你一个可运行的例子。代码可以改进,并使其更强大。

struct Version { 
    int m_major; 
    int m_minor; 
    int m_release; 
    int m_minor_release; 

    Version() : m_major(-1), 
       m_minor(-1), 
       m_release(-1), 
       m_minor_release(-1) { } 

    // Convert a str to a version object 
    explicit Version(const std::string& str_version) : Version() { 
    size_t offset = 0; 
    size_t finder; 

    // Cycle until find a character as '.' '-' '_' 
    while (finder = str_version.find_first_of(".-_", offset), 
      finder != std::string::npos) { 
     int* p = nullptr; 
     if (m_major == -1) { 
     p = &m_major; 
     } else if (m_minor == -1) { 
     p = &m_minor; 
     } else if (m_release == -1) { 
     p = &m_release; 
     } else { 
     p = &m_minor_release; 
     } 

     *p = std::stoi(str_version.substr(offset, finder - offset)); 
     offset = finder + 1; 
    } 

    if (offset != str_version.size() && m_minor_release == -1) { 
     m_minor_release = std::stoi(
     str_version.substr(offset,std::string::npos)); 
    } 
    } 

    bool operator<(const Version& oth) const { 
    // compare this version with another one 
    } 
}; 

我希望你能找到你的问题的实施有用这个小例子。