8

TCHARサポートを使用してWindowsでアプリをビルドする場合、 %sinはAnsiビルドとUnicodeビルドの文字列を_tprintf()意味し、その逆を意味します。char *wchar_t *%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_ASCIISTRまたはPF_UNICODESTRマクロを使用して、Cの自動文字列リテラルの連結を利用します。

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

'_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")); }
于 2019-05-15T08:12:46.043 に答える