考虑以下示例程序:

#include <cstdio>
#include <cwchar>
#include <string>

int main()
{
    std::string narrowstr = "narrow";
    std::wstring widestr = L"wide";
    printf("1 %s \n", narrowstr.c_str());
    printf("2 %ls \n", widestr.c_str());
    wprintf(L"3 %s \n", narrowstr.c_str());
    wprintf(L"4 %ls \n", widestr.c_str());

   return 0;
}

输出为:
1 narrow
2 wide

我很好奇:
  • 为什么3和4没有打印
  • 1&3和2&4之间有什么区别。
  • 如果utf8中的arrowstr和utf16中的widestr有什么区别?
  • 最佳答案

    您需要做:

    wprintf(L"3 %hs \n", narrowstr.c_str());
    wprintf(L"4 %s \n", widestr.c_str());
    

    为什么?因为对于printf%s 说的是窄字符字符串。对于wprintf%ls 说宽。

    但是,对于wprintf%s 表示宽,%ls 表示宽。 %hs 表示较窄(两者均适用)。对于printf%s ,以这种方式仅表示%hs

    在VC++/Windows上,%S(大写S)将反转效果。因此,printf("%S")的意思是宽,而wprintf("%S")的意思是窄。这对于_tprintf很有用。

    09-07 07:00