是否有格式说明符始终与_tprintf一起表示char字符串?

| 当您使用
TCHAR
支持在Windows上构建应用程序时,
_tprintf()
中的
%s
表示Ansi构建为
char *
字符串,Unicode构建为
wchar_t *
,而
%S
则相反。 但是,是否有任何格式说明符始终表示“ 3”字符串,而不管它是Ansi还是Unicode构建?由于即使在Windows上也未真正使用UTF-16进行文件或网络连接,因此无论您将应用程序编译为哪种本机字符类型,您仍然经常需要处理基于字节的字符串。     
已邀请:
h
修饰符将
%s
%S
都强制为
char*
,而
l
修饰符将两者都强制为
wchar_t*
,即:
%hs
%hS
%ls
%lS
。     
这也可以解决您的问题:
_TCHAR *message;
_tprintf(_T(\"\\n>>>>>> %d\") TEXT(\" message is:%s\\n\"),4,message);
    
您可以轻松地编写如下内容:
#ifdef _UNICODE
#define PF_ASCIISTR    \"%S\"L
#define PF_UNICODESTR  \"%s\"L
#else
#define PF_ASCIISTR    \"%s\"
#define PF_UNICODESTR  \"%S\"
#endif
然后在格式字符串中使用
PF_ASCIISTR
PF_UNICODESTR
宏,并利用C自动字符串文字串联:
_tprintf(_T(\"There are %d \") PF_ASCIISTR _T(\" over the table\"), 10, \"pens\");
    
我发现\'_ vsntprintf_s \'对TCHAR类型使用\'%s \'并适用于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\")); }
    

要回复问题请先登录注册