2012-09-26 3 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/1174085#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'연결이 있다고 선언 할 수 없습니다. 아이디어가 있습니까? –

+0

당신은 우리에게 보여주지 않는 무언가를하고 있습니다. 더 많은 정보를 입력하십시오. C 연결로 선언 된 것이 있습니까 (예 :'extern "C"')? 이 .cpp 또는 .c 파일 (질문에'C++ '태그가 붙어 있습니까?)입니까? –

+0

예 C++ 사용자 지정 작업 프로젝트를 사용하고 있기 때문에 함수에 'Extern "C"'가 있습니다. 죄송합니다. 이것은 .cpp 파일입니다. :) –