无法将参数'1'的'LPCWSTR {aka const wchar_t *}'转换为'const char *'到'int printf(const char *,...)'

时间:2019-12-11 05:52:14

标签: c char wchar

最近四,五年我从未尝试用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);

1 个答案:

答案 0 :(得分:0)

取决于您的项目配置,_tprintf()映射到printf()TCHAR映射到charwprintf()映射到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()

相关问题