1. 程式人生 > >C++ 軟體版本號對比

C++ 軟體版本號對比

在軟體更新時,需要根據版本號來決定是否需要自動更新,所以就涉及到版本號的對比了。

下面給出的是使用string的compare函式進行版本號判斷的程式碼:

#include "stdafx.h"
#include <string>
#include <vector>
using namespace std;


vector<wstring> split_wstring(wstring &szInput, wstring &szToken)
{
	vector<wstring> result;
	int pos = 0;
	int begin = 0;
	const int size = szToken.size();
	while (true)
	{
		pos = szInput.find(szToken, begin);
		if (pos == wstring::npos)
		{
			result.push_back(szInput.substr(begin));
			break;
		}
		result.push_back(szInput.substr(begin, pos - begin));
		begin = pos + size;
	}
	return result;
}

//retval: 0:相等;1:大於伺服器版本,-1:小於伺服器版本,2:版本欄位數不一致
int CompareVersion(std::wstring wszLoc, std::wstring wszSvr)
{
	//
	std::vector<std::wstring> locVerFields = split_wstring(wszLoc, std::wstring(L"."));
	std::vector<std::wstring> srvVerFields = split_wstring(wszSvr, std::wstring(L"."));

	int loc_size = locVerFields.size();
	int srv_size = srvVerFields.size();
	if (loc_size != srv_size)
	{
		return 2;
	}

	int retval = 0;
	for(int i=0; i < locVerFields.size(); i++)
	{
		int istrcmp = 0;
		istrcmp = locVerFields[i].compare(srvVerFields[i]);
		if ( istrcmp == 0 )
		{
			if (i == locVerFields.size()-1)//最後一個
			{
				retval = 0;
				break;
				//return 0;
			}
		}
		else if( istrcmp == 1)
		{
			retval = 1;
			break;
			//return 1;
		}
		else if (istrcmp < 0)
		{
			retval = -1;
			break;
			//return -1;
		}
	}
	return retval;
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::wstring wszLocal = L"1.2.3.14";
	std::wstring wszServer = L"1.2.3.15";
	int res = CompareVersion(wszLocal, wszServer);

	printf("%d\r\n", res);
	system("pause");

	return 0;
}