我正在跟进本指南来自 MSDN 关于如何列出目录中的文件(我正在使用当前目录)。就我而言,我需要将信息放入数据包的消息部分(大小为 1016 的字符数组)中,以将其发送到客户端。当我在客户端和服务器上打印 packet.message 时,仅显示文件名的第一个字符。怎么了?这是相关代码部分的片段:
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile(TEXT("./*.*"), &f);
string file;
int size_needed;
do
{
sprintf(packet.message,"%s", &f.cFileName);
//Send packet
} while(FindNextFile(h, &f));
这通常是由于宽字符串被错误地视为 ASCII 字符串造成的。该构建针对 UNICODE 和cFileName
包含一个宽字符串,但是sprintf()
假设它是一个 ASCII 字符串。
FindFirstFile()将被映射到FindFirstFileA()
or FindFirstFileW()
取决于构建是否针对 UNICODE。
一个解决方案是使用FindFirstFileA()
和明确的 ASCII 字符串。
请注意,&
中不需要sprintf()
:
sprintf(packet.message, "%s", f.cFileName);
由于应用程序正在使用超出其控制范围的字符串(即文件名),我建议使用更安全的_snprintf()避免缓冲区溢出:
/* From your comment on the question 'packet.message' is a 'char[1016]'
so 'sizeof()' will function correctly. */
if (_snprintf(packet.message, sizeof(packet.message), "%s", f.cFileName) > 0)
{
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)