3

你好,我的代码有问题。

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,然后它只是很多奇怪的字符,我不知道为什么或者这是一个更好的方法?

4

2 回答 2

5

您的代码不必要地复杂。如果您只想为\*.txt输入路径字符串添加后缀,您可以简单地使用std::string其重载operator+.

然后,如果您想将 a 传递std::string给具有const char*(ie 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 编程;soconst wchar_t*std::wstring是比const char*and更好的选择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;
}
于 2012-11-09T16:52:36.663 回答
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;
}
于 2012-11-09T16:27:31.447 回答