Есть ли спецификатор формата, который всегда означает строку символов с _tprintf? - PullRequest
7 голосов
/ 15 апреля 2011

Когда вы создаете приложение в Windows, используя поддержку TCHAR, %s в _tprintf() означает char * строку для сборок Ansi и wchar_t * для сборок Unicode, тогда как %S означает обратное.

Но есть ли спецификаторы формата, которые всегда означают char * строку независимо от того, является ли это сборкой Ansi или Unicode? Поскольку даже в Windows UTF-16 на самом деле не используется для файлов или работы в сети, оказывается, что вам все еще довольно часто приходится иметь дело со строками на основе байтов, независимо от того, какой собственный тип символов вы компилируете в приложении.

Ответы [ 4 ]

5 голосов
/ 15 апреля 2011

Модификатор h заставляет оба значения %s и %S до char*, а модификатор l заставляет оба значения wchar_t*, то есть: %hs, %hS, %ls и%lS.

1 голос
/ 20 апреля 2012

Это также может решить вашу проблему:

_TCHAR *message;
_tprintf(_T("\n>>>>>> %d") TEXT(" message is:%s\n"),4,message);
0 голосов
/ 15 мая 2019

Я обнаружил, что _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")); }
0 голосов
/ 15 апреля 2011

Вы можете легко написать что-то вроде этого:

#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");
...