printf未知说明符%S

时间:2011-09-19 18:19:00

标签: c windows printf format-specifiers

我正在尝试使用示例代码,它使用以下几行:

   WCHAR cBuf[MAX_PATH];

    GetSharedMem(cBuf, MAX_PATH);

    printf("Child process read from shared memory: %S\n", cBuf);

获取共享内存:

__declspec(dllexport) VOID __cdecl GetSharedMem(LPWSTR lpszBuf, DWORD cchSize) 
{ 
    LPWSTR lpszTmp; 

    // Get the address of the shared memory block

    lpszTmp = (LPWSTR) lpvMem; 

    // Copy from shared memory into the caller's buffer

    while (*lpszTmp && --cchSize) 
        *lpszBuf++ = *lpszTmp++; 
    *lpszBuf = '\0'; 
}

奇怪的是我在printf行上遇到了一个未知的说明符错误。 %S是MS扩展而不兼容ANSI,但我认为默认情况下会包含它。我该怎么开启?

我正在使用微软视觉工作室,不知道如何检查我的选项

2 个答案:

答案 0 :(得分:3)

来自http://www.globalyzer.com/gzserver/help/localeSensitiveMethods/formatting.htm#larges

不合格的字符串说明符(大%S)

这些表显示了Windows和ANSI如何根据%S说明符和函数调用样式(单个,通用或宽)处理参数:

    Windows function                Specifier    Parameter needs to be
    printf/sprintf (single/MBCS)    %S           wchar_t*
    _tprintf/_stprintf (generic)    %S           (don't use)
    wprintf/swprintf (wide)         %S           char*

    ANSI function                   Specifier    Parameter needs to be
    printf/sprintf (single/MBCS)    %S           wchar_t*
    wprintf/swprintf (wide)         %S           wchar_t*

ANSI和Windows在单字节或宽字方面基本上将%S视为与%s相反,具有讽刺意味的是,Windows和ANSI再次以不同的方式处理这些说明符。

请注意,ANSI本质上总是以与%ls相同的方式处理%S,换句话说,它总是被假定为宽字符串。

另一方面,Windows根据函数调用的类型对待%S。对于单字节函数调用,%S的作用类似于宽%ls说明符,但对于宽函数调用,%S的作用类似于单字节%hs说明符。

此说明符不应用于Windows通用调用。由于%S是%s的“反向”,如果_UNICODE标志关闭,则参数需要为宽,如果_UNICODE标志为打开,则需要为单字节。 TCHAR泛型类型不能以这种方式工作,并且没有“反TCHAR”类型的数据类型。

我在Visual C ++ 2010中尝试了以下内容:

#include "stdafx.h"
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    WCHAR cBuf[MAX_PATH];
    TCHAR tBuf[MAX_PATH];

    wcsncpy_s(cBuf, L"Testing\r\n", MAX_PATH);
    _tcsncpy_s(tBuf, _T("Testing\r\n"), MAX_PATH);

    printf("%S", cBuf); // Microsoft extension
    printf("%ls", cBuf); // works in VC++ 2010
    wprintf(L"%s", cBuf); // wide
    _tprintf(_T("%s"), tBuf); // single-byte/wide

    return 0;
}

设定:

/ ZI / nologo / W3 / WX- / Od / Oy- / D“WIN32”/ D“_DEBUG”/ D“_CONSOLE”/ D“_UNICODE”/ D“UNICODE”/ Gm / EHsc / RTC1 / GS / fp:precise / Zc:wchar_t / Zc:forScope /Yu"StdAfx.h“/Fp"Debug\TestWchar.pch”/ Fa“Debug \”/ Fo“Debug \”/Fd "Debug\vc100.pdb“/ Gd / analyze- / errorReport:queue

答案 1 :(得分:1)

要打印宽字符串:

wchar_t * str = /*...*/

printf("The string: %ls\n", str);
// or
wprintf(L"The string: %ls\n", str);