2012-11-09 101 views
3

您好,我在這裏遇到了我的代碼問題。FindFirstFile LPCSTR

LPCSTR mergeString(LPCSTR firstString, std::string secondString) 
{ 
    string convertedString = ConvertString(firstString); 
    LPCSTR mergedString; 
    int i = convertedString.size(); 

    convertedString.insert(i, secondString); 
    mergedString = (convertedString.c_str()); 

    return mergedString; 
} 

void GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA File_Data; 
    LPCSTR lPath = mergeString(path,"\\*.txt"); 
    FindFirstFile(lPath, &File_Data); 
    wcout << File_Data.cFileName; 
} 

您傳遞的路徑要在的GetFiles(LPCSTR路徑),那麼我用mergestring功能路徑以擴展(\ *。TXT)一切正常返回的時候,除了一起合併使用LPCSTR然後它只是很多奇怪的人物,我不知道爲什麼或者是一個更好的方式來做到這一點?

+1

這是你的主要問題:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – chris

+2

根據[本文檔'c_str'方法](http://www.cplusplus.com/reference/string/string/c_str/),返回值是「只有保證保持不變,直到下一次調用非常量成員函數爲止字符串對象「。破壞對象計數爲非常量成員函數,此時'c_str'返回的值不再有效。 –

回答

5

你的代碼是不必要複雜。 如果您只是想爲輸入路徑字符串添加\*.txt後綴,則可以簡單地使用std::string及其重載的operator+

然後,如果你想要一個std::string傳遞給具有const char*(即LPCSTR)參數的Win32 API,你可以使用std::string::c_str()方法:

void GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA fileData; 
    std::string searchPath(path); 
    searchPath += "\\*.txt"; 

    FindFirstFile(searchPath.c_str(), &fileData); 
    wcout << fileData.cFileName; 
} 

還要注意的是,在現代世界裏,你應該使用Unicode (UTF-16)用於Win32編程;所以const wchar_t*std::wstringconst char*std::string更好。此外,我只是使用std::wstring類作爲參數,而不是原始wchar_t指針。

void GetFiles(const std::wstring& path) 
{ 
    std::wstring searchPath = path + L"\\*.txt"; 
    WIN32_FIND_DATA fileData; 
    FindFirstFile(searchPath.c_str(), &fileData); 
    std::wcout << fileData.cFileName; 
} 
0

GetFiles函數返回一個指針到內存是不再有效,File_Data.cFileName只能在GetFiles使用,因爲這就是File_Data定義。最簡單的解決方案是使用C++字符串類std::string

std::string GetFiles(LPCSTR path) 
{ 
    WIN32_FIND_DATA File_Data; 
    LPCSTR lPath = mergeString(path,"\\*.txt"); 
    FindFirstFile(lPath, &File_Data); 
    return File_Data.cFileName; 
} 

不必要的使用指針是一個不好的習慣,因爲這種原因(更多)。

您的mergeString函數也應該用更少的指針重寫。

std::string mergeString(LPCSTR firstString, std::string secondString) 
{ 
    string convertedString = ConvertString(firstString); 
    int i = convertedString.size(); 

    convertedString.insert(i, secondString); 
    return convertedString; 
}