2012-09-26 50 views
0

嗨,我使用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但我需要獲得第二個也很有價值。

+0

啊!現在退出。使用'std :: string'。 – BoBTFish

+0

使用'strtok'來找到第一個空間是很愚蠢的。你正在編寫C++代碼,使用一個合理的字符串類。 –

+0

'boost :: split()'是一個備選選項(例如,請參閱http://stackoverflow.com/questions/11273989/parse-delimited-string/11274085#11274085)。 – hmjd

回答

1

爲什麼你不把它存儲在一個向量?

std::vector<std::string> parts; 
pch = strtok (szValueBuf," "); 
parts.push_back(pch); 

while (pch != NULL) 
{ 
    pch = strtok (NULL, " "); 
    parts.push_back(pch); 
} 
+0

我試過你的解決方案,但得到了這個錯誤'錯誤C2894:模板不能被聲明爲'C'linkage'..any的想法? –

+0

那麼你正在做的事情,你不向我們展示。請提供更多信息。有沒有用C連接聲明的東西(例如'extern「C」')?這是.cpp或.c文件(你的問題被標記爲「C++」)? –

+0

是的,當我使用C++自定義操作項目時,函數中有'Extern「C」'。抱歉應該說明。它是一個.cpp文件。:) –