0

我编写了一个函数来从路径返回扩展名,如下所示:

 LPTSTR GetExtension(LPCTSTR path1)
{
    CString str(path1);
    int length = str.ReverseFind(L'.');
    str = str.Right(str.GetLength()-length);

    LPTSTR extension= str.GetBuffer(0);
    str.ReleaseBuffer();

    return extension;

}

我检查了语句,发现扩展名在返回时具有有效值(.txt),但是当我在 main 方法中使用以下语句时,如下所示

LPTSTR extension = GetExtension(L"C:\\Windows\\text.txt");

变量扩展名具有以下垃圾值:ﻮ</p>

ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮ䞐泸᠀pꬰp⚜p⚜p⚜

谁能告诉我背后的原因是什么?

4

2 回答 2

1

您正在返回一个指向已释放缓冲区的指针。 缓冲区是函数的局部变量两个大禁忌。将签名更改为

 size_t GetExtension(LPCTSTR path, LPTSTR buffer, size_t bufferSize)

这样您就可以将结果复制到缓冲区中。

或者返回一个 CString 或 std::wstring,你使用的是 C++,而不是 C。使用 TCHAR 也是处理字符串的一种非常过时的方式,最后一个非 Unicode 版本的 Windows 于 12 年前及时死亡。

于 2012-10-14T11:41:06.093 回答
0

我没有我的编译器,但你可能正在获取缓冲区并存储它的位置。然后在 LPTSTR 仍指向一个位置时释放它。

或者,当您在函数内部查看它时,LPTSTR 可能在堆栈上。退出该功能时,您将失去它。

于 2012-10-14T09:20:17.393 回答