8

TCHAR当您使用支持在 Windows 上构建应用程序时, %sin_tprintf()表示char *Ansi 构建和wchar_t *Unicode 构建的字符串,而%S反之亦然。

char *但是,无论是 Ansi 还是 Unicode 版本,是否有任何格式说明符始终表示字符串?由于即使在 Windows 上 UTF-16 也没有真正用于文件或网络,所以无论您将应用程序编译为何种本机字符类型,您仍然经常需要处理基于字节的字符串。

4

4 回答 4

7

h修饰符强制%s%Schar*,并且修饰符l同时强制 到 wchar_t*,即:%hs%hS%ls%lS

于 2011-04-14T22:01:41.667 回答
1

这也可能解决您的问题:

_TCHAR *message;
_tprintf(_T("\n>>>>>> %d") TEXT(" message is:%s\n"),4,message);
于 2012-04-20T05:27:03.960 回答
0

你可以很容易地写出这样的东西:

#ifdef _UNICODE
#define PF_ASCIISTR    "%S"L
#define PF_UNICODESTR  "%s"L
#else
#define PF_ASCIISTR    "%s"
#define PF_UNICODESTR  "%S"
#endif

然后在格式字符串中使用PF_ASCIISTRorPF_UNICODESTR宏,利用 C 自动字符串文字连接:

_tprintf(_T("There are %d ") PF_ASCIISTR _T(" over the table"), 10, "pens");
于 2011-04-14T20:26:37.037 回答
0

我发现,'_vsntprintf_s' 使用 '%s' 作为 TCHAR 类型并且适用于 GCC 和 MSVC。所以你可以像这样包装它:

int myprintf(const TCHAR* lpszFormat, va_list argptr) {
    int len = _vsctprintf(lpszFormat, argptr); // -1:err
    if (len<=0) {return len;}
    auto* pT = new TCHAR[2 + size_t(len)];
    _vsntprintf_s(pT, (2+len)*sizeof(TCHAR), 1+len, lpszFormat, argptr);
    int rv = printf("%ls", pT);
    delete[] pT;
    return rv;
}
int myprintf(const TCHAR* lpszFormat, ...) {
    va_list argptr;
    va_start(argptr, lpszFormat);
    int rv = myprintf(lpszFormat, argptr);
    va_end(argptr);
    return rv;
}



int main(int, char**) { return myprintf(_T("%s"), _T("Test")); }
于 2019-05-15T08:12:46.043 回答