最近四,五年我从未尝试用C进行编码,所以我不知道如何解决这个问题。
我的代码是这样的:
char szExePath[MAX_PATH]; //
//"C:\\Program Files (x86)\\Application Verifier\\vrfauto.dll"
printf("Please input the execution file path:\n");
scanf("%s", szExePath);
//char LPCWSTR
WCHAR wsz[64];
swprintf(wsz, L"%S", szExePath);
LPCWSTR m_szFilename = wsz;
setlocale(LC_ALL, "chs");
_tprintf(m_szFilename);
答案 0 :(得分:0)
取决于您的项目配置,_tprintf()
映射到printf()
或TCHAR
映射到char
时wprintf()
映射到wchar_t
。显然,您的项目已设置为将TCHAR
映射到char
,这就是为什么在将wchar_t*
传递到printf()
时会出错的原因。
但是,您显示的代码未使用TCHAR
,因此您根本不应该使用_tprintf()
。 m_szFilename
明确是wchar_t[]
,因此直接使用wprintf()
即可:
wprintf(m_szFilename);
另外,考虑使用wscanf()
来读取输入内容,并将其作为wchar_t[]
的开头,而不要使用中间的char[]
:
WCHAR szExePath[MAX_PATH]; //
//L"C:\\Program Files (x86)\\Application Verifier\\vrfauto.dll"
printf("Please input the execution file path:\n");
wscanf(L"%259s", szExePath);
setlocale(LC_ALL, "chs");
wprintf(szExePath);
但是请注意,无论您使用scanf()
还是wscanf()
,读取都会在空白处停止,因此,如果用户输入类似"C:\Program Files (x86)\Application Verifier\vrfauto.dll"
的路径,则缓冲区将仅接收{{1 }}。为了解决这个问题,您将需要使用"C:\Program
/ gets()
(或更安全的_getws()
/ gets_s()
)或_getws_s()
/ fgets()