如何解决是否有格式说明符始终与_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\")); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。