我编写了一个函数来从路径返回扩展名,如下所示:
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⚜叕Ú
谁能告诉我背后的原因是什么?
答案 0 :(得分:1)
您正在返回指向已释放缓冲区的指针。 和缓冲区是函数的局部变量。两个都没有。将签名更改为
size_t GetExtension(LPCTSTR path, LPTSTR buffer, size_t bufferSize)
这样您就可以将结果复制到 buffer 中。
或者返回CString或std :: wstring,你使用的是C ++,而不是C.使用TCHAR也是处理字符串的一种严重过时的方式,最后一个非Unicode版本的Windows在12年前及时死亡。
答案 1 :(得分:0)
我没有我的编译器,但可能你可能正在获取缓冲区并存储它的位置。然后在LPTSTR仍然指向一个位置时释放它。
或者当你在函数内部查看它时,LPTSTR可能在堆栈中。在退出该功能时,您将失去它。