char* take_module_name()
{
TCHAR FilePath[MAX_PATH + 1]; // буфер для имени файла
GetModuleFileName(NULL, FilePath, sizeof(FilePath) / sizeof(FilePath[0]));
int lastSlash = 0;
for (int i = 0; i < MAX_PATH + 1; i++)
{
if (FilePath[i] == '\\' || FilePath[i] == '/')lastSlash = i;
}
char filename[40];
strcpy(filename, &FilePath[lastSlash + 1]);
filename[39] = '\0';
return filename;
}
为什么当我调用这个函数时它不输出文件名,即使函数中的文件名显示正常?我这样称呼:
cout << take_module_name();
虽然如果你这样做,那么一切正常,但经过一段时间:
string file_way = (string)OBF("DEL /q %systemroot%\\Prefetch\\") + take_module_name();
cout << file_way;
事实证明,循环有时会返回错误的 lastSlash,但为什么我不清楚。
@Ildar 已经写过关于返回指向局部变量的指针。但是代码中还有另一个错误——在下面的代码中
事实是字符串
FilePath可以很短,数组末尾会有垃圾。并且很可能有斜线字符。怎么修?您可以滑动正确的长度而不是MAX_PATH+1,但据我了解,这并不有趣。可以这样吗
而且您最初可以将整个数组归零。
更改
string通过引用传递返回
string更改传递给函数的 char 数组
我们返回一个指向函数中分配的动态 char 数组的指针,但这是一个非常糟糕的选择,因为外部有人需要清除内存
我还建议改用该函数
strcpy_s,strcpy因为有了它,您将确定要写入目标字符串的字符数,并在源字符串长于结果字符串时避免缓冲区溢出。对于 KoVadim 的回答,我想补充一点,将参数传递给
strcpy第二个参数必须是 const char* 的函数时出现错误,并且您正在传递TCHAR*. 我会建议: