当前位置:C++技术网 > 资讯 > 为什么sprintf_s格式化字符串会出现乱码,而_vsnprintf却不会?

为什么sprintf_s格式化字符串会出现乱码,而_vsnprintf却不会?

更新时间:2016-04-12 17:59:56浏览次数:1+次

  项目开发中,经常会用到打印日志,程序员也有自己的一套常用打印日志的方法,而我在写自己的日志打印代码的时候,发现了如题的错误。

  先来看看我写的代码吧。


#include <stdio.h>
#include <windows.h>
#include <tchar.h>

const TCHAR *strLogfName = _T(".\\ServiceLogf.txt");
const TCHAR *strLogvName = _T(".\\ServiceLogv.txt");

void WriteLogf(const TCHAR *lpFmt, ...)
{
	TCHAR lpFmts[2048] = {0};
	SYSTEMTIME systemTime;
	GetLocalTime(&systemTime);
	FILE *pfile = fopen(strLogfName, "w");
	fprintf(pfile, "%d-%d-%d %d:%d:%d   ", systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
	va_list arglist;
	va_start(arglist, lpFmt);
	sprintf_s(lpFmts, 2047, lpFmt, arglist);//lpFmts出现乱码
	va_end(arglist);
	fprintf(pfile, lpFmts);
	fclose(pfile);
}

void WriteLogv(const TCHAR *lpFmt, ...)
{
	TCHAR lpFmts[2048] = {0};
	SYSTEMTIME systemTime;
	GetLocalTime(&systemTime);
	FILE *pfile = fopen(strLogvName, "w");
	fprintf(pfile, "%d-%d-%d %d:%d:%d   ", systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
	va_list arglist;
	va_start(arglist, lpFmt);
	_vsnprintf(lpFmts, 2047, lpFmt, arglist);//lpFmts没有出现乱码
	va_end(arglist);
	fprintf(pfile, lpFmts);
	fclose(pfile);
}

int main()
{
	WriteLogf("test%d%s\n", 10, "中文测试");
	WriteLogv("test%d%s\n", 10, "中文测试");
	return 0;
}


  输出的日志分别是


2016-4-12 17:41:0   test10中文测试
2016-4-12 17:46:8   test1637980@^~


  在网上查了很多资料,也查了MSDN,还是没有找到合理的解答,望各位大神指点指点。