Wie kann ich von _TCHAR * umwandeln * auf char, wenn C ++ mit variabler Länge args?

StackOverflow https://stackoverflow.com/questions/1613217

  •  06-07-2019
  •  | 
  •  

Frage

Wir brauchen ein Format _TCHAR * string, und eine Reihe von Zeichen passieren * Strings in eine Funktion mit variabler Länge argumente:

inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) {
  //...
}

So kann es wie so aufgerufen werden:

char *foo = "foo";
char *bar = "bar";
LogToFileA(_T("Test %s %s"), foo, bar);

Offensichtlich eine einfache Lösung wäre _TCHAR statt char zu verwenden, aber wir haben nicht diesen Luxus leider.

Wir müssen diesen Einsatz mit va_start, etc, so können wir einen String formatiert werden:

va_list args;
_TCHAR szBuf[BUFFER_MED_SIZE];

va_start(args, cArgs);
_vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
va_end(args);

Leider können wir dies nicht verwenden, weil es uns diesen Fehler geben:

Unhandled exception at 0x6a0d7f4f (msvcr90d.dll) in foobar.exe:
0xC0000005: Access violation reading location 0x2d86fead.

Ich denke, wir müssen unsere char * konvertieren * zu _TCHAR - aber wie?

War es hilfreich?

Lösung

Mit% hs oder% hs statt% s. Das wird die Parameter zwingt sowohl Ansi und Unicode-Versionen von printf () interpretted als char * werden - Stil Funktionen, das heißt:

inline void LogToFile(const _TCHAR *szFmt, ...)
{  
  va_list args;
  TCHAR szBuf[BUFFER_MED_SIZE];

  va_start(args, szFmt);
  _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
  va_end(args);
}  

{
  char *foo = "foo"; 
  char *bar = "bar"; 
  LogToFile(_T("Test %hs %hs"), foo, bar); 
}

Andere Tipps

In der Regel sieht es wie folgt aus:

char *foo = "foo";
char *bar = "bar";
#ifdef UNICODE
LogToFileW( L"Test %S %S", foo, bar); // big S
#else
LogToFileA( "Test %s %s", foo, bar);
#endif

Ihre Frage ist nicht ganz klar. Wie Sie Ihre Funktion implementiert ist und wie Sie es verwenden?

Hier war meine Lösung - ich Verbesserungsvorschläge willkommen

!
inline void FooBar(const _TCHAR *szFmt, const char *cArgs, ...) {

    va_list args;
    _TCHAR szBuf[BUFFER_MED_SIZE];

    // Count the number of arguments in the format string.
    const _TCHAR *at = _tcschr(szFmt, '%');
    int argCount = 0;
    while(at) {
        argCount++;
        at = _tcschr(at + 1, '%');
    }

    CA2W *ca2wArr[100];
    LPWSTR szArgs[100];
    va_start(args, cArgs);
    for (int i = 1; i < argCount + 1; i++) {
        CA2W *ca2w = new CA2W(cArgs);
        szArgs[i] = ca2w->m_psz;
        ca2wArr[i] = ca2w;
        cArgs = va_arg(args, const char *);
    }
    va_end(args);

    // Use the new array we just created (skips over first element).
    va_start(args, szArgs[0]);
    _vstprintf_s(szBuf, BUFFER_MED_SIZE, szFmt, args);
    va_end(args);

    // Free up memory used by CA2W objects.
    for (int i = 1; i < argCount + 1; i++) {
        delete ca2wArr[i];
    }

    // ... snip ... - code that uses szBuf
}

ist dies etwas, was ich vorher benutzt habe TCHAR zu konvertieren verkohlen, hoffe, es hilft, obwohl ich war nicht wirklich für die Optimierung der Suche, es ist also nicht der schnellste Weg, .. aber es hat funktioniert!

    TCHAR tmp[255];
::GetWindowText(hwnd, tmp, 255);
std::wstring s = tmp;

//convert from wchar to char
const wchar_t* wstr = s.c_str();
size_t wlen = wcslen(wstr) + 1;
char newchar[100];
size_t convertedChars = 0;
wcstombs_s(&convertedChars, newchar, wlen, wstr, _TRUNCATE);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top