2017-05-31 2 views
1

Ich versuche, zwei doppelte Werte in Zeichenfolgen in C++ zu konvertieren, so dass ich TRACE verwenden kann, um sie in meinem Ausgabefenster anzuzeigen. Ich bin mit Visual Studio 2017. Hier ist mein Haupt-Code:Konvertieren von Double in String in C++ gibt seltsame Zeichen (chinesische Zeichen?)

double distance = 3.0; 
double secondsPassed = 10.0; 
TRACE(L"Hello!\n"); 
TRACE(L"distance = %s seconds passed: %s \n", 
    std::to_string(distance).c_str(), std::to_string(secondsPassed).c_str()); 

Dies ist die Definition meiner TRACE-Funktion:

void TRACE(TCHAR *format, ...) 
{ 
    TCHAR buffer[1000]; 

    va_list argptr; 
    va_start(argptr, format); 
    wvsprintf(buffer, format, argptr); 
    va_end(argptr); 

    OutputDebugString(buffer); 
} 

Dies ist, was in meinem Ausgabefenster zeigt nach oben:

Hello! 
distance = ⸳〰〰〰 time: 〱〮〰〰0찀쳌쳌 

Ich bin nicht sicher, warum die zwei Doppelwerte nicht in die Strings "3.0" und "10.0" konvertiert werden. Stattdessen bekomme ich diese komischen Charaktere! Ich entschuldige mich, wenn sie nicht chinesische Schriftzeichen sind, wie ich im Titel erwähnte - ich weiß nur Englisch

Alle Vorschläge oder Kommentare würden sehr geschätzt! Vielen Dank.

+2

Dies scheint wie eine komplizierte Art, Dinge zu tun. Anstatt die Werte in Zeichenfolgen zu konvertieren, so dass sie der '% s'-Formatierungsdirektive entsprechen, warum lassen Sie sie nicht als' double's und verwenden Sie eine '% f'-Anweisung? –

+1

die temporäre std :: string ist weg, wenn Sie eine const-Referenz zuweisen die temporäre Lebensdauer ist Garantie zu überleben, aber TRACE ist eine Variadic-Funktion. Erstellen Sie die Zeichenfolge, bevor die TRACE das Problem lösen wird –

+0

@AlessandroTeruzzi wird diese Zeichenfolge nicht erst nach dem Aufruf der Funktion zerstört, zu der sie das Argument ist? – stijn

Antwort

4

Das Problem ist, dass Ihr TRACE Makro breite Strings erwartet, aber Sie schmale passieren: Sehen Sie sich die w in Funktion wvsprintf().

Verwenden Sie std::to_wstring() und es sollte funktionieren.

Alternativ können Sie %hs verwenden, um zu sagen, dass Ihre Argumente schmale Zeichenfolgen sind. Oder Sie können das Makro ändern und es anrufen vsprintf().

+2

% hs anstelle von% S könnte erwähnt werden. –

+0

@HansPassant: Oh ja, das wusste ich nicht. '% hs' ist besser als'% S', da es immer ein 'const char *' ist, unabhängig von den UNICODE-Optionen, passend zu 'std :: string'. – rodrigo

+0

vielen dank, es hat funktioniert !! –