嗨,我使用strtok
函數將句子拆分爲兩部分。我似乎無法弄清楚如何保存兩個單獨的值,該功能是在我只需要知道的時刻成功分割句子以存儲值。由於保存strtok函數的值
extern "C" UINT __stdcall GetProductName(MSIHANDLE hInstall)
{
HRESULT hr = S_OK;
UINT er = ERROR_SUCCESS;
char szProductName[MAX_PATH];
TCHAR* szValueBuf = NULL;
DWORD cchValueBuf = 0;
char * pch;
std::vector<std::string> parts;
hr = WcaInitialize(hInstall, "GetProductName");
ExitOnFailure(hr, "Failed to initialize");
WcaLog(LOGMSG_STANDARD, "Initialized.");
UINT uiStat = MsiGetProperty(hInstall, TEXT("ProductName"), TEXT(""), &cchValueBuf);
if (ERROR_MORE_DATA == uiStat)
{
++cchValueBuf;
szValueBuf = new TCHAR[cchValueBuf];
if (szValueBuf)
{
uiStat = MsiGetProperty(hInstall, TEXT("ProductName"), szValueBuf, &cchValueBuf);
}
}
if (ERROR_SUCCESS != uiStat)
{
if (szValueBuf != NULL)
delete[] szValueBuf;
return ERROR_INSTALL_FAILURE;
}
if (Orc_Create_Product_Key(szValueBuf))
hr = S_OK;
else
hr = ERROR_INSTALL_FAILURE;
pch = strtok (szValueBuf," ");
parts.push_back(pch);
while (pch != NULL)
{
pch = strtok (NULL, " ");
parts.push_back(pch);
}
strcpy(szProductName, szValueBuf);
hr = MsiSetProperty(hInstall, "PRODUCTNAME", szProductName);
ExitOnFailure(hr, "failed to set PRODUCTNAME");
LExit:
er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE;
return WcaFinalize(er);
}
正如你所看到的第一個值將是szProductName
但我需要獲得第二個也很有價值。
啊!現在退出。使用'std :: string'。 – BoBTFish
使用'strtok'來找到第一個空間是很愚蠢的。你正在編寫C++代碼,使用一個合理的字符串類。 –
'boost :: split()'是一個備選選項(例如,請參閱http://stackoverflow.com/questions/11273989/parse-delimited-string/11274085#11274085)。 – hmjd